通过服务引用创建 .net 客户端时出错

Error creating .net client via Service References

尝试在 C# .Net 4.0 中为此 wsdl 定义的 Web 服务生成代理客户端时遇到问题:link(我没有管理此服务,它似乎是一个基于 Axis2 MTOM Java 的服务)

这是生成器反馈:

1):
Details: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Object reference not set to an instance of an object.
XPath to the source of error: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:portType[@name='ServiceV3WS']

2):
Error: Unable to import wsdl:binding
Detail: An error occurred while importing wsdl:portType which depends wsdl:binding.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:portType[@name='ServiceV3WS']
XPath to the source of error: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:binding[@name='SlsServiceWSSoapBinding']

3):
Error: Unable to import wsdl:port
Detail: An error occurred while importing wsdl:binding which depends wsdl:port.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:binding[@name='SlsServiceWSSoapBinding'] 
XPath to the source of error: //wsdl:definitions[@targetNamespace='http://sls.ws.coliposte.fr']/wsdl:service[@name='SlsServiceWS']/wsdl:port[@name='SlsServiceWSPort']
  1. 这些错误对我来说似乎很神秘,但错误 2 和 3 似乎取决于错误 1。所以我的假设首先是此服务不兼容(例如,portType 未定义为正确的道路)。所以我尝试使用 wsdl 验证器来验证它(我试过 wsdl-analyzer.com)并且 returns 我认为一切正常。
  2. 所以我的第二个假设是我以错误的方式生成了代理:
    • 我尝试通过 Visual Studio (2012) 中的“ 添加服务引用 ” 菜单选项使用 "standard WCF way"。
    • 我还尝试使用 svcutil.exe (v 4.0.30319.xxx) 生成客户端代理。很明显,它returns同样的错误。 (好像VS后台用的是svcutil)

我的期望:

好吧,我在 SO 上看到了很多关于这种代理生成的相关问题。但我的主要问题是我真的不明白实际问题是什么。所以我决定 post 一个新问题来请求对这些错误的解释:它们是什么意思,为什么会出现这样的错误以及生成这样的代理的替代方法 ways/tools。

这是我第一次 post 发表评论,请随时评论。

提前致谢,再见。

我花了几个小时才找到关于这个问题的信息,我找到了我的问题的答案并解决了它。

我查看了 svcutil.exe documentation page 并尝试了看起来最适合我的问题的选项("randomly" 是实际术语)。

经过几次试错周期后,我的情况似乎缺少 /serializer:XmlSerializer 选项 "generates data types that use the XmlSerializer for serialization and deserialization" 。 有关信息,默认值为 /serializer:Auto "generates classes marked with the Serializable Attribute".

关于我之前的问题,我可以说:

  • 对问题的理解:目前,这些错误对我来说仍然是个谜。这个 "Object reference not set to an instance of an object" 并不是 "real" 问题的一个很好的描述符。也许罪犯的名字 class System.ServiceModel.Description.DataContractSerializerMessageContractImporter 是我错过的线索。

  • 构建此类代理的替代方案:svcutil 是默认“添加服务引用”菜单选项的替代方案。它允许根据目标服务的上下文使用一组自定义选项。作为一个缺点,它很少集成到 Visual Studio 架构的常规工作流程中。因此必须集成 "manually" 生成的输出代理 classes 及其配置文件。这样,每次代理都会更新,终于不是不可能完成的任务了。

总而言之,也许要做的改进是让用户在 VS 生成中配置自己的一组参数 UI(如果你看到这个线程并在 Microsoft 从事 VS 项目,你知道什么要做:))

谢谢。 期待这个答案可以帮助处于类似情况的任何人。