【问题标题】:Handle unknown soap message from WCF处理来自 WCF 的未知肥皂消息
【发布时间】:2012-01-18 19:39:30
【问题描述】:

我有一个在 C# .net 控制台应用程序中使用来自 WSDL + XSD 的 SVCUTIL 生成的客户端。一切都很好,但出于某些逻辑错误处理的目的,客户端可能会收到一条响应消息,该消息未在 WSDL 中定义,因此反序列化 & 将失败,但方法不会抛出异常而是返回 null。

是否有任何通用的方法来处理这种情况,或者我定义了一个故障/错误消息 xsd(对于服务器返回的肥皂消息),如果响应为空,则处理/反序列化消息。

PS:我的远程服务无法为逻辑错误抛出错误异常。(是的,那里有点阻塞)。

【问题讨论】:

  • 如果您的服务返回的消息不在 WSDL 中,则说明该消息已损坏。那怎么不“坏”呢?
  • 嗨,约翰,感谢您的回复。它没有损坏,我调用该方法并得到空响应,没有例外,我使用 fiddler 并查看返回的是另一条消息,不能通过消息合约反序列化。我们必须从服务返回另一条消息,因为由于逻辑错误(限制),我们不能抛出一个肥皂错误。
  • 这没有意义。可以从服务返回的所有内容必须在 WSDL 中定义。
  • hmmm 好点,你知道我是这里的新手,我会尝试重新生成 WSDL,然后我可能会看到一些错误消息,但如果我只是在方法的响应中输入错误消息怎么办。严格来说,我的 WCF 服务是在不同的内部工具中定义的,所以我很难解释这部分。首先我尝试重新生成 WSDL,我会回来的。再次感谢约翰的回复。我很感激。

标签: c# wcf soap wsdl soap-client


【解决方案1】:

WSDL 是契约。就像您有两个对象并在它们之间定义了接口一样。如果第一个对象调用第二个对象的操作,它期望返回由接口定义的值。如果我们使用一些非强类型语言,第二个对象将能够返回不同类型的返回值,而第一个对象将由于意外错误而失败。

编程语言有办法解决这个问题——如果是 .NET,你会使用 object 类型作为返回值,你总是需要手动调查你收到了什么类型以及如何处理返回值。在 WCF 的情况下,我们也有这样的高级类型 - System.ServiceModel.Channels.Message,但您真的不想使用它,因为在这种情况下,您将不得不手动构建 SOAP 请求并手动解析传入的响应。

作为 Web 服务中的一个附注,单个请求类型始终具有单个响应类型和零个或多个错误类型(它们是 SOAP 错误)。如果您的服务在单个请求类型上返回不同的响应类型,则该服务不是“有效”的 Web 服务,并且无法由 WSDL 描述。因此,它也不能采用自动生成的 WCF 代理提供的强类型方式。

【讨论】:

  • 谢谢你的回复,我有一个WCF不标准的情况。我试着再解释一下。我的 WSDL 方法只有输入和输出参数(复杂类型)。这个方法是使用工具创建的,它不会暴露任何东西,比如在逻辑错误或自定义错误上手动抛出异常。所以我们可以选择将另一条消息作为输出响应。好的,我们收到了,生成的客户端无法反序列化响应,因为它不知道如何做到这一点。所以我想知道是否有任何标准方法来处理这种反序列化失败。我希望我很清楚。谢谢。
  • 不,不是。在这种情况下,您必须直接使用 SOAP 消息。编写不同的输出在 Web 服务中无效。如果您需要多种输出类型,您应该为您的第一个输出建模以支持主题。例如为结果代码添加字段或在内部使用 XSD 选择。
  • 好的,我明白了。我将在 Message XSD 中添加一个结果类型字段并检查它以响应自定义错误。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 2013-01-27
  • 2011-07-17
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多