【问题标题】:Losing WCF FaultException details when using binary使用二进制文件时丢失 WCF FaultException 详细信息
【发布时间】:2014-10-18 10:42:18
【问题描述】:

我有一个具有以下自定义绑定的 WCF 服务:

    <binding name="binaryHttpBinding" >
      <binaryMessageEncoding />
      <httpTransport maxReceivedMessageSize="2147483647" />
    </binding>

(客户端当然有匹配这个绑定的配置)。问题是客户端没有收到通用的 FaultException,例如客户没有收到“T”,如果我跟踪呼叫,我可以验证它。但是,如果我使用 Soap 1.2 将 binaryMessageEncoding 替换为 textMessageEncoding,则所有故障异常都会包含故障详细信息。

我在网上搜索并找不到任何声称通过 HTTP 进行二进制消息编码与通用 WCF 错误异常不兼容的信息。此外,我似乎无法控制大部分二进制消息编码 - 例如,我无法在配置 SOAP 消息版本中设置(WCF 不支持二进制编码)。我想知道是否支持这种情况。

【问题讨论】:

  • 请显示工作和失败的完整绑定配置。
  • @PhilDegenhardt,我设法找到了原因。请参阅我自己的答案。

标签: wcf soap encoding wcf-binding faultexception


【解决方案1】:

在花了好几个小时试图找出可能出错的地方之后,我终于成功了。失败的两个原因,没有一个是显而易见的。

  1. 故障消息类已覆盖执行某些计算的 ToString 方法。将这样的逻辑放在 ToString 中当然是不明智的,但谁能猜到这只会影响二进制序列化?
  2. FaultException 构造函数有一个可选参数“actionName”,我将其设置为发生异常的方法的名称。显然 WCF 对可以分配给动作名称的内容非常挑剔,但将其留空总是有效的。再说一次,谁能猜到它只影响二进制序列化并且以这种奇怪的方式(所以它丢弃了客户端的消息错误)?

【讨论】:

  • 我有同样的问题,但我不确定如何让您的解决方案发挥作用。对于 2,我还没有通过 actionName,所以我认为没关系。但是你为 1 改变了什么?我的故障类没有ToString 方法,如果这就是你的意思的话。
  • 好吧,我也发现了我的问题。我们的服务合同有一个属性,它实现了IErrorHandler,并且在ProvideFault 实现中,我们设置了与您正在执行的操作类似的操作(您的第二点)。将System.ServiceModel.Channels.Message.CreateMessage(...) 的action 参数留空,或者将其保留为现有的action 值,为我解决了这个问题。
  • 对这个问题的一个很好的解释在这里:blogs.msdn.microsoft.com/drnick/2007/02/05/… 要点是,预期的操作值默认情况下基于 FaultContract 及其类型。 “例如,如果我的服务契约是 IService,我的操作称为 Action,并且我使用的是类型化的 FaultException 实例,那么默认的错误操作是 tempuri.org/IService/ActionStringFault。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
相关资源
最近更新 更多