c# - Visual Studio 生成的服务引用中的 XML 命名空间问题

标签 c# .net wcf web-services

我正在连接到由第三方提供商托管的网络服务。我已经在我的项目中向 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/

相关文章:

c# - 为什么 'dynamic' ExpandoObject 抛出 RuntimeBinderException,即使它包含属性的定义?

c# - 在没有 WMI 的情况下使用 C# 检测 Windows 进程启动和退出事件

WCF 多重绑定(bind)端口号

c# - .net 客户端将 soap 故障解析为协议(protocol)异常

C# Windows 窗体从嵌入式 Windows Media Player 捕获图像

c# - 如果 MySQL 表中的字段为空,则更新该字段

c# - NotifyPropertyChanged 事件,其中事件参数包含旧值

c# - ClickOnce 部署应用程序的 Prism 架构注意事项

c# - 父节点内列表的序列化(集合扁平化)

c# - WCF:身份验证服务还是基于 token 的安全性?