Nei*_*eil 8 c# wcf wsdl dynamic wcf-binding
我试图在C#中编写一些代码,通过导入WSDL,检查它然后动态调用它来动态调用WCF服务.
我正在调用的服务可能会不时更改 - 所以如果它确实如此,我希望我的客户端知道新方法和新输入参数以及调用的输出参数,而无需重建我的客户端.
一种可能的解决方案是动态导入和编译服务引用.
这里概述:从WSDL动态创建程序集
我想避免生成一个组件,然后尽可能地反射它.
我查看了链接中动态代理的代码,他们使用框架类来进行导入.这个班是WsdlImporter.所以我认为很好 - 我可以使用它并检查WSDL模式并确定存在哪些调用以及可用的输入和输出.
问题是创建的MessagePartDescription对象中缺少类型信息WsdlImporter.显然这是因为它无法找到类型而丢失- 请参阅Brian对问题的回答.
那么关于我应该如何进行的任何建议?我在这里走错了路吗?
这可能不是一个答案,但我会将其作为一个完整描述我的意见.
动态代理:
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.它再次意味着新客户.
| 归档时间: |
|
| 查看次数: |
2407 次 |
| 最近记录: |