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

时间:2015-03-24 10:54:26

标签: c# web-services wcf wsdl svcutil.exe

我在尝试使用此wsdl:link定义的Web服务在C#.Net 4.0中生成代理客户端时遇到问题(我不管理此服务,它似乎是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)并且它返回我一切都没问题。
  2. 所以我的第二个假设是我以错误的方式生成代理:
    • 我尝试通过Visual Studio(2012)的“添加服务参考”菜单选项使用“标准WCF方式”。
    • 我还尝试使用 svcutil.exe (v 4.0.30319.xxx)生成客户端代理。显然,它返回相同的错误。 (似乎svcutil在VS的后端使用。)
  3. 我的期望:

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

    所以这是我关于SO的第一篇文章,所以请随时查看和评论。

    先谢谢你,见到你。

1 个答案:

答案 0 :(得分:4)

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

我查看了svcutil.exe documentation page并尝试了与我的问题最匹配的选项(“随机”是实际术语)。

经过几次试错循环后,似乎 / serializer:XmlSerializer 选项“生成使用XmlSerializer进行序列化和反序列化的数据类型”在我的案例中缺失。 有关信息,默认值为 / serializer:Auto “生成标有Seri​​alizable属性的类。”

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

  • 对问题的理解:现在,这些错误对我来说仍然很神秘。这个“未设置为对象实例的对象引用”实际上并不是“真实”问题的良好描述。也许这个罪名System.ServiceModel.Description.DataContractSerializerMessageContractImporter的名字是我错过的线索。

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

总而言之,可能需要做的改进是让用户在VS生成UI中配置自己的一组参数(如果你在VS项目中看到这个线程并在Microsoft工作,你知道该怎么做:))< / p>

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