2

我正在使用 Visual Studio 2010 的 Beta 2 版本来使用 WF4 进行一些高级学习。我一直在使用 WF_WCF_Samples SDK 中的 SqlTracking 示例,并且非常了解如何在 SQL 数据库中发出和存储跟踪数据,但还没有看到有关如何在需要时查询数据的任何内容。有谁知道是否有任何 .Net 类可用于查询跟踪数据,如果有,是否有任何已知的示例、教程或文章来描述如何查询跟踪数据?

4

3 回答 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 回答