C# 使用WorkflowServiceHost托管工作流

C# 使用WorkflowServiceHost托管工作流,c#,workflow,.net-4.0,workflowservice,C#,Workflow,.net 4.0,Workflowservice,好的,我可能没有正确地理解这一点,但实际上我正在尝试使用4.0中的新WF服务来构建承载WF服务的Windows服务。目前,我已经构建了客户机(包含一个简单的活动XAML)和服务(在XAMLX文件中实现的WF服务)项目 我试过为每一个简单的“你好世界”。客户端已托管在工作流应用程序中,我最初将该服务设置为默认的WF服务项目模板。两人在那里似乎都很好 因为我想在没有IIS的情况下托管服务,所以我的下一次尝试自然是在WorkflowServiceHost中托管我的服务。为此,我可以使用XamlServ

好的,我可能没有正确地理解这一点,但实际上我正在尝试使用4.0中的新WF服务来构建承载WF服务的Windows服务。目前,我已经构建了客户机(包含一个简单的活动XAML)和服务(在XAMLX文件中实现的WF服务)项目

我试过为每一个简单的“你好世界”。客户端已托管在
工作流应用程序中
,我最初将该服务设置为默认的WF服务项目模板。两人在那里似乎都很好

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

首先,我将服务工作流设置为只在启动时写入文本文件,但什么也没发生。我尝试使用断点进行调试,但由于它在运行时加载XAMLX文件,VS不允许我调试WF。因此,我尝试稍微修改一下客户端项目,以使用
WorkflowServiceHost
而不是
WorkflowApplication
。我使用了与测试hello world样式的工作流相同的工作流,这次没有输出到console,
WorkflowApplication
成功地实现了这一点

下面是我使用客户端在控制台项目中托管工作流服务的基本步骤。如果有人想查看工作流的XAML,请告诉我,我将更新此问题。以下是
Main()
中的宿主代码


我发现,由于您无法直接启动由
WorkflowServiceHost
对象包装的WF实例,因此运行它有点困难,并且通过一个简单的方法调用几乎不可能,就像您可以使用
WorkflowApplication
完成的那样。有一个“把戏”让WF开火,但需要一点黑客攻击,我还没有给时间在这个关头。MSDN在托管非服务工作流的下有一个模糊的参考,说明了在这种情况下可以做什么

这就是我使用的解决方案:同时使用WorkflowServiceHost和WorkflowApplication。你为什么问?因为我试着在一个小包裹里做很多事情。我还在为我的工作构建一个定制服务模型,最好将业务逻辑(WorkflowApplication)与所有通信实现(WorkflowServiceHost)分开。服务以这种方式启动很好,因为现在我的底层通信工作流从接收活动开始,WorkflowSerieHosts在关联工作流的根目录下查找某种类型的消息传递活动,以便启动实例

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

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();