我正在尝试用C#编写一些代码,通过导入WSDL,检查它然后动态调用它来动态调用WCF服务。
我正在调用的服务可能会不时更改 - 所以如果确实如此,我希望我的客户端知道新方法和新输入参数以及调用的输出参数,而无需重建我的客户端。
一种可能的解决方案是即时导入和编译服务引用。
此处概述:Creating an assembly on the fly from a WSDL
我想避免生成组件,然后尽可能反映它。
我查看了链接中动态代理的代码,他们使用框架类来进行导入。这个类是WsdlImporter
。所以我认为很好 - 我可以使用它并检查WSDL模式并确定存在哪些调用以及可用的输入和输出。
问题是MessagePartDescription
创建的WsdlImporter
对象中缺少类型信息。显然缺少because it cannot find the types yet - see the response to the question from Brian.
那么关于我应该如何进行的任何建议?我完全走错了吗?
答案 0 :(得分:5)
这可能不是答案,但我会将其作为一个完整描述我的意见。
动态代理:
IMO这是错误使用技术的例子。它是WSDL的基本行为 - 如果它发生变化,您必须更改客户端,或者您必须进行良好的WSDL版本控制并创建新客户端。
您仍然必须以某种方式说您的客户端获取WSDL - 它是否意味着您将在每次调用之前解析WSDL?看起来不是一个好主意。
有关类型的信息实际上不是WSDL的一部分,因为默认情况下WSDL是生成可互操作的。 CLR类型不是互操作性所需的操作。当您通过添加服务引用或Svcutil创建服务代理时,它将为WSDL中定义的类型生成代码。然后需要编译该代码。
您可以尝试使用NetDataContractSerializer
代替默认DataContractSerializer
。 NetDataContractSerializer将CLR类型信息添加到WSDL中,但我仍然希望客户端必须知道新类型 - 这意味着部署带有类型的新程序集并由客户端使用它。当使用新的静态客户端代理部署程序集时,这几乎听起来像是一样的方法。
动态WF客户端
我也没有看到太多使用这种架构 - 您仍然需要更改客户端以反映新的WF步骤,不是吗?
更改WF
我们在谈论Windows Workflow基础吗?我很难想象您创建WF的场景,将其作为服务公开然后更改它。当您将WF公开为服务时,您可能正在定义长时间运行的WF。长时间运行的WF使用基于序列化的持久性(至少在WF 3.5中,但我相信它在WF 4中是相同的)。当您更改WF定义时,所有持久化的WF很可能注定失败,因为它们永远不会反序列化。这种情况通常通过并行部署新旧版本来解决,其中旧版本仅用于完成不完整的WF。它再次意味着新客户。
答案 1 :(得分:1)
如果从不同角度看问题。您是否需要每次都重新生成代理,或者您是否需要在事情发生变化时继续工作的合同?
WCF有一个针对此IExtensibleDataContracts的机制,请参阅:http://msdn.microsoft.com/en-us/library/ms731083%28v=VS.100%29.aspx
可以找到合同版本化的最佳做法here