WF4工作流版本,服务合同发生更改

WF4 workflow versions where service contract changes

我刚刚使用WCF的路由服务成功实现了WF4"版本控制"系统。我有一个version1工作流服务,向其中添加了一个新的Decision活动并将其保存为version2服务。因此,现在我有2个端点(具有相同的服务合同,即,这两个服务的所有Receive活动都相同)和一个路由器,用于检查消息的内容(对象上的" versionId"字符串,我所有Receive都将其接受为参数)决定要命中哪个端点。

我的问题是,尽管在不对服务合同进行任何更改的情况下也能正常工作,但如何处理从我的服务合同中添加或删除方法以及创建version3服务的需求?我最初的想法是,当我将服务引用添加到客户端时,我使用最新的工作流服务的端点来获取最新的服务合同。然后,在配置文件中,更改连接到路由器端点的端点。但是,如果v1和v2的合同与v3不同,则这将不起作用。我的代理将具有v3的方法,而忘记了有关v1和v2的所有信息。

关于如何处理此问题的任何想法?我是否应该在我的工作流解决方案中创建一个实际的服务合同接口(而不是仅在我的Receive活动中提供ServiceContractName)?


在WCF很小的时候,我听到一些声音在争论端点版本控制(对于Web服务而言)应该使用文件夹结构来完成。我从来没有想过要自己尝试一下,但是对我来说,仅分析这种策略的结果似乎是一个出色的解决方案。我没有WCF的生产经验,但是打算使用.NET 4.0版(ASP.NET,WCF,WF ...)启动一个相当全面的解决方案,在这个阶段,我会争辩说使用文件夹结构来分隔版本端点将是一个很好的解决方案。

这种策略的本质是永远不要更改或删除终结点合同(特定版本),直到您100%确定不再使用它为止。随着服务的发展,您只需要添加新的合同和端点即可。如果没有一个应有的结构化开发人员,这可能会导致代码重复。但是通过引入服务外观,重复将变得无关紧要


如果WCF合同发生变更,您的客户将需要了解其他操作以及何时调用它们。我使用了活动书签,它包含一些应用程序中的持久性存储中的WCF操作,以通过检查启用的书签并基于此启用/禁用UI控件来使客户端应用程序动态地适应工作流。将新操作添加到工作流的新版本时,仍将必须更新客户端。


我也经历过同样的情况。您可以在自定义实现的帮助下维护版本。将工作流服务URL保存在数据库中。并根据需要调用它们。

您可以获取有关通过客户端使用URL调用WF服务的信息。

http://rajeevkumarsrivastava.blogspot.in/2014/08/consume-workflow-service-45-from-client.html

希望这会有所帮助