2010-05-18 86 views
2

好的,所以我可能会接近这个错误,但本质上我试图在4.0中使用新的WF服务来建立一个Windows服务,托管一个WF服务。目前我已经构建了客户端(包含一个简单的Activity XAML)和服务(在XAMLX文件中实现了WF服务)项目。托管工作流与WorkflowServiceHost

我已经尝试过简单的“hello worlds”for each one。客户端托管在WorkflowApplication中,我最初将该服务设置为默认的WF服务项目模板。在那里似乎都很好。

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

起初,我设置了服务工作流程,以便在开始时写入文本文件,但没有发生任何事情。我试图用断点进行调试,但由于它在运行时加载了XAMLX文件,因此VS不允许我调试WF。所以我尝试改变客户端项目以使用WorkflowServiceHost而不是WorkflowApplication。我使用了相同的工作流程来测试hello世界风格的工作流程,这一次没有输出到控制台,并且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(); 

回答

2

什么我发现是,因为你不能直接启动由WorkflowServiceHost对象包装的WF实例,它是一个有点痛,以通过简单的方法调用,比如你可以运行它,几乎是不可能的用WorkflowApplication完成。有一个“窍门”让WF开火,但需要一些我在这个时候没有给予时间的黑客攻击。 MSDN有一个模糊的参考,你可以在这种情况下做什么here,在托管非服务工作流程

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

现在我是一个快乐的露营者。我的业务逻辑完成了预期的工作,并且工作流服务正在充实。更好的是,我有一个模型,可以动态地放下业务逻辑以动态设置和部署自定义数据处理/运行服务。现在只需完善电话回复功能即可实现远程“仪表板”的日期,这就是我正在接下来的工作。