Visual Studio生成的服务参考中的XML命名空间问题

时间:2020-03-06 14:42:34  来源:igfitidea点击:

我正在连接到由第三方提供商托管的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()时,出现以下消息异常:

The top XML element '_return' from
  namespace '' references distinct types
  System.Boolean and
  Service.Status.
  Use XML attributes to specify another
  XML name or namespace for the element
  or types.

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

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

wsdl,生成的服务参考或者我的代码是否有问题?

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

解决方案

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

在调用服务方法之前,我不会调用ClientBase.Open方法,因为我从未见过对此的需求。我确实总是适当地调用Close&Abort方法。 Open方法基本上只是将客户端的状态更改为不再可配置。我不确定这将如何触发生成的类中的代码,因为它是一个继承的方法。尝试仅删除该行,看看是否遇到相同的异常。否则,如果尚未执行此操作,请在生成的代码中搜索所有使用_return的位置,并查看是否可以手动整理出适当的类型。我们可能需要为每个上下文使用不同的名称。

解决WSDL的另一种方法是创建Web引用(假定其基于HTTP的服务),然后查看生成的代码是否按预期工作。如果可以,请与ASMX客户端一起使用,除非我们需要WCF代理功能。