2

我正在连接到由第三方提供商托管的 Web 服务。我已经在我的项目中向 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 和 Service.Status。使用 XML 属性为元素或类型指定另一个 XML 名称或命名空间。

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

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

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

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

4

1 回答 1

2

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

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

Another way to troubleshoot the WSDL is to create a Web Reference (assuming it’s an HTTP based service) and see if the generate code works as expected. If it does work, go with the ASMX client unless you have a need for WCF proxy capabilities.

于 2008-09-25T19:25:09.590 回答