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代理功能。