Почему SqlTrackingService не работает с WF 4.0? - PullRequest
1 голос
/ 20 апреля 2011

В Workflow Foundation 3.5 мы могли отслеживать данные с помощью SqlTrackingService, но в WF это не работает: при попытке использовать SqlTrackingService не перехватывает какой-либо рабочий процесс или событие активности.

Есть ли способ настроить SqlTrackingService в WF 4.0 без написания пользовательской службы трассировки? Дело в том, что я хочу использовать как можно больше встроенных инструментов (например, WorkflowMonitor из примеров MS)

Вот два примера:

WF3.5 (работает отлично, обратите внимание, что My3Activity необходимо скомпилировать как .NET 3.5 Workflow Activity Library)

namespace WfServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Creating workflow runtime...");
            using (WorkflowRuntime wr = new WorkflowRuntime())
            {
                SqlTrackingService ts = new SqlTrackingService("Initial Catalog=Tracking;Data Source=localhost;Integrated Security=SSPI;");
                ts.UseDefaultProfile = true;

                wr.AddService(ts);

                wr.StartRuntime();

                Console.WriteLine("Creating workflow instance...");
                WorkflowInstance wi = wr.CreateWorkflow(typeof(My3Activity));

                Console.WriteLine("Starting workflow instance...");
                wi.Start();
                Console.WriteLine("Workflow instance started");
                Console.WriteLine("Press any key to STOP");
                Console.ReadKey();
            }
            Console.WriteLine("Workflow runtime stopped.");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

WF4.0 (не вызывает никаких событий или, возможно, они не отслеживаются службой отслеживания; на этот раз MyActivity - библиотека действий .NET 4.0 WF)

namespace WfServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Creating workflow runtime...");
            using (WorkflowRuntime wr = new WorkflowRuntime())
            {
                SqlTrackingService ts = new SqlTrackingService("Initial Catalog=Tracking;Data Source=localhost;Integrated Security=SSPI;");
                ts.UseDefaultProfile = true;

                wr.AddService(ts);

                wr.StartRuntime();

                Console.WriteLine("Creating workflow instance...");
                MyActivity activity = new MyActivity();
                WorkflowApplication app = new WorkflowApplication(activity);

                Console.WriteLine("Starting workflow instance...");
                app.Run();
                Console.WriteLine("Workflow instance started");
                Console.WriteLine("Press any key to STOP");
                Console.ReadKey();
            }
            Console.WriteLine("Workflow runtime stopped.");
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

1 Ответ

1 голос
/ 20 апреля 2011

Нет связи между WF3 и WF4.Последний полностью переписан и не имеет общих типов с предыдущим WF3.В результате SqlTrackingService в .NET 4 работает только с WF3.

Ваш второй пример кода представляет собой интересное сочетание типов WF3 и WF4.WorkflowApplication - WF4, а используемое WorkflowRuntime - WF3.Смешивать их вообще не имеет никакого смысла.

Если предполагается, что это WF4, код должен выглядеть примерно так:

namespace WfServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Creating workflow instance...");
            MyActivity activity = new MyActivity();
            WorkflowApplication app = new WorkflowApplication(activity);

            Console.WriteLine("Starting workflow instance...");
            app.Run();
            Console.WriteLine("Workflow instance started");
            Console.WriteLine("Press any key to STOP");
            Console.ReadKey();
        }
    }
}
...