Я работаю с версией Visual Studio 2010 Beta 2, чтобы получить некоторое продвинутое обучение с использованием WF4. Я работал с образцом SqlTracking в SDK WF_WCF_Samples и получил довольно хорошее представление о том, как испускать и хранить данные отслеживания в базе данных SQL, но ничего не видел о том, как запрашивать данные при необходимости. Кто-нибудь знает, есть ли какие-либо .Net-классы, которые будут использоваться для запроса данных отслеживания, и если да, то есть какие-либо известные образцы, учебные пособия или статьи, описывающие, как запрашивать данные отслеживания?Windows Workflow Foundation 4.0 и отслеживание
ответ
Согласно Matt Winkler, из WF4 команды Microsoft, не существует каких-либо встроенных в API для запроса данные отслеживания, разработчик должен написать свой собственный.
Старый вопрос, я знаю, но на самом деле более или менее официальный 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.
Спасибо за сообщение, но я думаю, я в замешательстве. Мне кажется, что приведенные выше ссылки - это все образцы того, как испускать данные отслеживания, а затем хранить их где-нибудь (например, базу данных или журнал событий). Я ищу механизм для запроса данных после его сохранения. В .Net 3.5 мы использовали метод SqlTrackingQuery и метод TryGetWorkflow(). Это то, что я пытаюсь найти - механизм для запроса сохраненных данных. Возможно, это не входит в WF4, и мне, возможно, придется писать собственные запросы. –
не относится к WorkflowInstanceQuery? я не выкопал это глубоко в wf4 ... –
Возможно, я не могу понять это из-за ограниченного количества документации, но, по крайней мере, этот класс используется в профиле отслеживания для испускания отслеживающие записи, которые затем могут использоваться участником TrackingParticipant для их хранения. Он может или не может использоваться также для запроса записей отслеживания после их хранения - как я уже сказал, трудно сказать из-за отсутствия документации. –