【问题标题】:XML namespace problem in Visual Studio generated service referenceVisual Studio 生成的服务引用中的 XML 命名空间问题
【发布时间】:2008-09-25 08:32:54
【问题描述】:

我正在连接到由第三方提供商托管的网络服务。我已经在我的项目中向 Web 服务添加了一个服务引用,VS 已经生成了所有需要的引用和类。

我正在连接这段代码(客户端名称和方法匿名):

 using (var client = new Client())
 {
     try
     {
         client.Open();
         var response = client.Method(...);
         return response.Status;
     }
     catch (SoapException ex)
     {
         throw CreateServiceException(ex);
     }
     finally
     {
          client.Close();
     }
 }

到达 client.Open() 时,我收到一条异常消息:

顶部的 XML 元素“_return”来自 命名空间''引用不同的类型 System.Boolean 和 服务状态。 使用 XML 属性指定另一个 元素的 XML 名称或命名空间 或类型。

在reference.cs中,我可以看到“_return”变量用

修饰
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]

wsdl、生成的服务引用或我的代码是否有问题?

更新:将服务生成为老式 Web 服务可以解决问题。我目前已将 Sixto 的答案标记为已接受,但我仍然很好奇可能导致问题的原因以及服务生成器的任何参数是否可以解决原始问题。

【问题讨论】:

    标签: c# .net wcf web-services


    【解决方案1】:

    如果您能够创建服务引用,则 WSDL 有效。异常消息是说您的 _return 存在命名空间/类型歧义问题。生成的代码可能在某些上下文中将其用作布尔值,而在另一个上下文中用作 Service.Status 类型。

    在调用服务方法之前我不会调用 ClientBase.Open 方法,因为我从未见过需要它。我总是酌情调用 Close & Abort 方法。 Open 方法基本上只是将客户端的状态更改为不再可配置。我不确定这将如何触发生成的类中的代码,因为它是一个继承的方法。我会尝试删除该行,看看你是否得到相同的异常。否则,如果您还没有这样做,请在生成的代码中搜索所有使用 _return 的地方,看看您是否可以手动排序出合适的类型。您可能需要为每个上下文使用不同的名称。

    解决 WSDL 故障的另一种方法是创建 Web 引用(假设它是基于 HTTP 的服务)并查看生成代码是否按预期工作。如果它确实有效,请使用 ASMX 客户端,除非您需要 WCF 代理功能。

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 2013-10-23
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多