我正在连接到由第三方提供商托管的网络服务。我已经在我的项目中向 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、生成的服务引用或我的代码是否有问题?
更新:将服务生成为老式网络服务解决了这个问题。我已将 Sixto 的回答标记为暂时接受,但我仍然很好奇是什么导致了问题,以及服务生成器的任何参数是否可以解决原始问题。
最佳答案
如果您能够创建服务引用,则 WSDL 有效。异常消息是说你有 _return 的命名空间/类型歧义问题。生成的代码可能在某些上下文中将其用作 bool 值,而在另一种上下文中将其用作 Service.Status 类型。
在调用服务方法之前,我不会调用 ClientBase.Open 方法,因为我从未见过需要它。我总是根据需要调用 Close & Abort 方法。 Open 方法基本上只是将客户端的状态更改为不再可配置。我不确定这将如何触发生成的类中的代码,因为它是一个继承的方法。我会尝试删除该行,看看是否会出现相同的异常。否则,如果您还没有这样做,请在生成的代码中搜索所有使用 _return 的地方,看看您是否可以手动挑选出合适的类型。您可能需要为每个上下文使用不同的名称。
解决 WSDL 问题的另一种方法是创建 Web 引用(假设它是基于 HTTP 的服务)并查看生成代码是否按预期工作。如果确实有效,请使用 ASMX 客户端,除非您需要 WCF 代理功能。
关于c# - Visual Studio 生成的服务引用中的 XML 命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/132131/