2

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

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

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

起初,我将服务工作流程设置为在启动时简单地写入文本文件,但什么也没发生。我尝试使用断点进行调试,但由于它在运行时加载 XAMLX 文件,VS 不允许我调试 WF。因此,我尝试稍微更改客户端项目以使用 aWorkflowServiceHost而不是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();
4

1 回答 1

2

我发现,由于您不能直接启动由WorkflowServiceHost对象包装的 WF 实例,因此运行它有点痛苦,而且几乎不可能通过简单的方法调用来完成,就像您可以使用WorkflowApplication. 有一个“技巧”可以让 WF 着火,但需要一些我在这个时刻没有给时间的黑客攻击。MSDN 在Hosting Non-Service Workflows下对您可以在此场景中执行的操作有一个晦涩的参考

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

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

于 2010-05-24T12:40:46.833 回答