2010-01-15 7 views
2

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

ответ

1

Согласно Matt Winkler, из WF4 команды Microsoft, не существует каких-либо встроенных в API для запроса данные отслеживания, разработчик должен написать свой собственный.

0
+0

Спасибо за сообщение, но я думаю, я в замешательстве. Мне кажется, что приведенные выше ссылки - это все образцы того, как испускать данные отслеживания, а затем хранить их где-нибудь (например, базу данных или журнал событий). Я ищу механизм для запроса данных после его сохранения. В .Net 3.5 мы использовали метод SqlTrackingQuery и метод TryGetWorkflow(). Это то, что я пытаюсь найти - механизм для запроса сохраненных данных. Возможно, это не входит в WF4, и мне, возможно, придется писать собственные запросы. –

+0

не относится к WorkflowInstanceQuery? я не выкопал это глубоко в wf4 ... –

+0

Возможно, я не могу понять это из-за ограниченного количества документации, но, по крайней мере, этот класс используется в профиле отслеживания для испускания отслеживающие записи, которые затем могут использоваться участником TrackingParticipant для их хранения. Он может или не может использоваться также для запроса записей отслеживания после их хранения - как я уже сказал, трудно сказать из-за отсутствия документации. –

0

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

Вы должны найти фактической 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 предназначен только для базы данных Persistence.