c# - 使用 WorkflowServiceHost 托管工作流

标签 c# workflow .net-4.0 workflowservice

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

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

因为我想在没有 IIS 的情况下托管服务,自然我的下一次尝试是在 WorkflowServiceHost 中托管我的服务。为此,我可以使用 XamlServices.Load() 并将它返回的对象连同端点的 URI 传递给 WorkflowServiceHost 构造函数。我很担心,因为没有像 WorkflowApplication 类中那样的 Run() 成员方法。我假设 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();

最佳答案

我发现,由于您不能直接启动由 WorkflowServiceHost 对象包装的 WF 实例,因此运行它有点痛苦,并且通过简单的方法调用几乎不可能就像您可以使用 WorkflowApplication 完成一样。有一个“技巧”可以让 WF 开火,但需要一些黑客攻击,我在这个时候还没有时间。 MSDN 有一个关于您在此场景中可以做什么的模糊引用 here ,在托管非服务工作流下。

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

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

关于c# - 使用 WorkflowServiceHost 托管工作流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2857851/

相关文章:

c# - DependencyProperty 绑定(bind)问题

c# - 从 Appsettings app.config 文件调用连接字符串到 C# 代码

c# - Linq 结果内的嵌套连接数据

php - 帮助我改进我的持续部署工作流程

javascript - Web生产:外部JS文件中的绝对URL?

c# - 剪贴板在 .NET 3.5 和 4 中的行为不同,但为什么呢?

c# - 如何在 C# 中执行任务

python - 将命令行参数传递给 airflow BashOperator

.net - 如何强命名程序集以使其具有公钥 token

c# - 使用未分配的局部变量