Windows Workflow Foundation 4.0 и отслеживание - PullRequest
2 голосов
/ 15 января 2010

Я работаю с бета-версией Visual Studio 2010, чтобы получить более углубленное изучение с помощью WF4. Я работал с SqlTracking Sample в WF_WCF_Samples SDK и довольно хорошо понял, как генерировать и хранить данные отслеживания в базе данных SQL, но ничего не знал о том, как запрашивать данные при необходимости. Кто-нибудь знает, существуют ли какие-либо классы .Net, которые будут использоваться для запроса данных отслеживания, и если да, то есть ли какие-либо известные примеры, учебные пособия или статьи, в которых описывается, как запрашивать данные отслеживания?

Ответы [ 3 ]

1 голос
/ 18 января 2010

По словам Мэтта Винклера из команды Microsoft WF4, нет встроенного API для запроса данных отслеживания, разработчик должен написать свой собственный.

0 голосов
/ 04 сентября 2012

Старый вопрос, я знаю, но на самом деле в AppFabric есть более или менее официальный API: Библиотека классов Windows Server AppFabric

Вам нужно будет найти реальные DLL в% SystemRoot% \ AppFabric (после установки 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 предназначен только для Постоянной базы данных.

...