我正在连接到由第三方提供商托管的网络服务。我已经在我的项目中向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' namespace''引用不同的类型 System.Boolean和 Service.Status。 使用XML属性指定另一个 元素的XML名称或命名空间 或类型。
在reference.cs中,我可以看到“_return”变量用
修饰[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]
wsdl,生成的服务引用或我的代码是否有问题?
更新:作为旧学校Web服务生成服务可以解决问题。我已经将Sixto的答案标记为现在已被接受,但我仍然很好奇可能导致问题的原因以及服务生成器的任何参数是否可以解决原始问题。
答案 0 :(得分:1)
如果您能够创建服务引用,则WSDL有效。异常消息是说_return有命名空间/类型歧义问题。生成的代码可能在某些上下文中将其用作布尔值,而在另一个上下文中则用作Service.Status类型。
在调用服务方法之前,我没有调用ClientBase.Open方法,因为我从未见过需要它。我总是打电话给Close&适当地中止方法。 Open方法基本上只是将客户端的状态更改为不再可配置。我不确定如何在生成的类中触发代码,因为它是一个继承的方法。我试着删除该行,看看你是否得到了相同的异常。否则,如果您尚未执行此操作,请在生成的代码中搜索_return使用的所有位置,并查看是否可以手动排序相应的类型。每个上下文可能需要不同的名称。
解决WSDL问题的另一种方法是创建Web引用(假设它是基于HTTP的服务)并查看生成代码是否按预期工作。如果确实有效,请使用ASMX客户端,除非您需要WCF代理功能。