2014-10-18 60 views
2

我有以下的自定義綁定一個WCF服務:失去使用二進制時WCF FaultException異常細節

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

(客戶端具有匹配該綁定當然配置)。問題是客戶端沒有收到通用的FaultException,例如客戶沒有收到「T」,如果我跟蹤這些呼叫,我可以驗證它。但是,如果我使用Soap 1.2將textMessageEncoding替換爲binaryMessageEncoding,則所有故障例外都將充實故障細節。

我在網上搜索,無法找到任何信息,聲稱通過HTTP進行二進制消息編碼與通用WCF故障異常不兼容。此外,它看起來並不像我可以控制大部分二進制消息編碼 - 例如,我無法在配置SOAP消息版本中設置(WCF不支持二進制編碼)。我想知道這種情況是否被支持。

+0

請顯示工作和失敗的完整綁定配置。 – 2014-10-19 21:00:50

+0

@PhilDegenhardt,我設法找到原因。看到我自己的答案。 – 2014-10-20 20:41:20

回答

3

花了好幾個小時試圖找出可能出錯的地方後,我終於做到了。失敗的兩個原因,沒有一個是顯而易見的。

  1. 錯誤消息類已重寫了執行一些計算的ToString方法。當然,把這樣的邏輯放在ToString中是不明智的,但是誰能猜到這隻會影響二進制序列化?
  2. FaultException構造函數有一個可選參數「actionName」,我將其設置爲發生異常的方法的名稱。顯然,對於可以分配給動作名稱的內容,WCF是相當挑剔的,但將它留空仍然可行。再次,誰能猜測它只會影響二進制序列化並且以這種奇怪的方式(因此它會丟棄客戶端的消息錯誤)?
+0

我有同樣的問題,但我不知道如何讓您的解決方案工作。對於2,我沒有傳遞'actionName',所以我認爲沒關係。但是你爲1改變了什麼?如果這就是你的意思,我的錯誤類沒有'ToString'方法。 – 2017-12-21 13:23:48

+0

好吧,我也發現我的問題。我們的服務契約有一個實現了'IErrorHandler'的屬性,它在'ProvideFault'實現中,我們設置的行爲類似於你正在做的事情(你的第二點)。將System.ServiceModel.Channels.Message.CreateMessage(...)的操作參數保留爲null,或將其保留爲現有的操作值,爲我解決了這個問題。 – 2017-12-22 12:11:46

+0

對此問題的一個很好的解釋是:https://blogs.msdn.microsoft.com/drnick/2007/02/05/actions-for-faultexceptions/ 要點是預期的操作值是默認基於關於FaultContract及其類型。 「舉例來說,如果 我的服務合同是IService,我的操作稱爲動作,我用一個類型的FaultException 例如 是,那麼默認的故障 行動是http://tempuri.org/IService/ActionStringFault 「。 – 2017-12-22 12:21:02

相關問題