我正在使用 Visual Studio 2010 的 Beta 2 版本来使用 WF4 进行一些高级学习。我一直在使用 WF_WCF_Samples SDK 中的 SqlTracking 示例,并且非常了解如何在 SQL 数据库中发出和存储跟踪数据,但还没有看到有关如何在需要时查询数据的任何内容。有谁知道是否有任何 .Net 类可用于查询跟踪数据,如果有,是否有任何已知的示例、教程或文章来描述如何查询跟踪数据?
问问题
2436 次
3 回答
1
根据微软 WF4 团队的 Matt Winkler 的说法,没有任何内置的 API 用于查询跟踪数据,开发人员必须自己编写。
于 2010-01-18T17:05:50.390 回答
0
老问题,我知道,但实际上在 AppFabric 中或多或少有一个官方 API:Windows Server AppFabric 类库
您必须在 %SystemRoot%\AppFabric 中找到实际的 DLL(当然,在安装 AppFabric 之后)。放置它的地方很奇怪。
要查看的关键类是 SqlInstanceQueryProvider、InstanceQueryExecuteArgs。查询 API 是异步的,可以像这样使用(C#):
public InstanceInfo GetWorkflowInstanceInformation(Guid workflowInstanceId, string connectionString)
{
var instanceQueryProvider = new SqlInstanceQueryProvider();
// Connection string to the instance store needs to be set like this:
var parameters = new NameValueCollection()
{
{"connectionString", connectionString}
};
instanceQueryProvider.Initialize("Provider", parameters);
var queryArgs = new InstanceQueryExecuteArgs()
{
InstanceId = new List<Guid>() { workflowInstanceId }
};
// Total ruin the asynchronous advantages and use a Mutex to lock on.
var waitEvent = new ManualResetEvent(false);
IEnumerable<InstanceInfo> retrievedInstanceInfos = null;
var query = instanceQueryProvider.CreateInstanceQuery();
query.BeginExecuteQuery(
queryArgs,
TimeSpan.FromSeconds(10),
ar =>
{
lock (synchronizer)
{
retrievedInstanceInfos = query.EndExecuteQuery(ar).ToList();
}
waitEvent.Set();
},
null);
var waitResult = waitEvent.WaitOne(5000);
if (waitResult)
{
List<InstanceInfo> instances = null;
lock (synchronizer)
{
if (retrievedInstanceInfos != null)
{
instances = retrievedInstanceInfos.ToList();
}
}
if (instances != null)
{
if (instances.Count() == 1)
{
return instances.Single();
}
if (!instances.Any())
{
Log.Warning("Request for non-existing WorkflowInstanceInfo: {0}.", workflowInstanceId);
return null;
}
Log.Error("More than one(!) WorkflowInstanceInfo for id: {0}.", workflowInstanceId);
}
}
Log.Error("Time out retrieving information for id: {0}.", workflowInstanceId);
return null;
}
澄清一下 - 这不会让您访问存储在监控数据库中的跟踪数据。此 API 仅适用于持久性数据库。
于 2012-09-04T10:58:33.770 回答
0
于 2010-01-15T13:36:10.793 回答