使用WorkflowServiceHost托管工作流程

时间:2010-05-18 13:52:36

标签: c# workflow .net-4.0 workflowservice

好的,所以我可能会错误地接近这个,但实际上我正在尝试使用4.0中的新WF服务来构建托管WF服务的Windows服务。目前我构建了客户端(包含一个简单的Activity XAML)和服务(在XAMLX文件中实现的WF服务)项目。

我为每个人尝试过简单的“hello worlds”。客户端已托管在WorkflowApplication中,我最初将该服务设置为默认的WF服务项目模板。两者似乎都很好。

由于我想要托管没有IIS的服务,我自然而然地想要在WorkflowServiceHost中托管我的服务。这样做我可以使用XamlServices.Load()并将它返回的对象传递给WorkflowServiceHost构造函数以及端点的URI。我很担心,因为Run()类中没有WorkflowApplication成员方法。我假设Open()方法将服务主机对象作为服务打开,并且它将启动工作流的实例,但没有任何指示。

首先,我将服务工作流程设置为在文本文件启动时简单地写入文本文件但没有任何反应。我尝试使用断点进行调试,但由于它在运行时加载了XAMLX文件,因此VS不允许我调试WF。所以我尝试改变客户端项目以使用WorkflowServiceHost而不是WorkflowApplication。我使用了用于测试hello world样式工作流的相同工作流程,这次没有输出到控制台,WorkflowApplication之前的成功。

以下是我对客户端在控制台项目中托管工作流服务所做的基础知识。如果有人想看到工作流程的XAML让我知道,我会更新这个问题。这是Main()中的托管代码。

const String clientAddress = "http://localhost:9998/Client";    
WorkflowServiceHost wfHost = new WorkflowServiceHost( new ClientWf(), new Uri(clientAddress) );
wfHost.Open();

while( Console.ReadKey().KeyChar.ToString().ToUpper() != "X" ) {    }

wfHost.Close();

1 个答案:

答案 0 :(得分:2)

我发现是因为你不能直接启动被WorkflowServiceHost对象包装的WF实例,运行它有点痛苦,而且通过简单的方法调用几乎不可能完成WorkflowApplication。有一个“技巧”让WF发生火灾,但是在这个时刻我还没有花时间进行一些黑客攻击。 MSDN对托管非服务工作流下的此方案here中可以执行的操作进行了晦涩的参考。

这是我使用的解决方案:同时使用WorkflowServiceHost和WorkflowApplication。你为什么问?好吧,因为我试图在一个小小的包装中做很多事情。我也将其构建为我的工作的自定义服务模型,最好将业务逻辑(WorkflowApplication)与所有通信实现(WorkflowServiceHost)分开。服务以这种方式触发,因为当然现在我的基础通信。工作流以接收活动开始,WorkflowSericeHosts在相关工作流的根目录中查找某种类型的消息传递活动,以便启动实例。

现在我是一个快乐的露营者。我的业务逻辑按预期执行它应该执行的操作,并且工作流服务正在很好地充实。更好的是,我有一个模型,我可以动态地放弃业务逻辑来动态设置和部署自定义数据处理/运算服务。现在只是为了完善回拨最新的远程“仪表板”,这就是我接下来要做的事情。