2012-04-03 44 views
0

WCF大師,如何登錄http請求的身體和頭部,而在System.ServiceModel.Dispatcher.IErrorHandler處理錯誤

你可能已經知道答案,我找不到......

讓我們說我有一些Web服務(WCF)和客戶端應用程序(基於curl庫)。 在服務器站點有時我得到了奇怪的錯誤:

The OperationFormatter could not deserialize any information from the Message because the Message is empty (IsEmpty = true). System.Runtime.Serialization.SerializationException: The OperationFormatter could not deserialize any information from the Message because the Message is empty (IsEmpty = true). Source: System.ServiceModel Stack trace: at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters) Rethrown as: System.ServiceModel.CommunicationException: Error in deserializing body of request message for operation '...'. The OperationFormatter could not deserialize any information from the Message because the Message is empty (IsEmpty = true). Source: System.ServiceModel Stack trace: at System.ServiceModel.Dispatcher.PrimitiveOperationFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) ...

在客戶現場我看到(在日誌中),一個客戶端發送一個請求,該請求不爲空(有一些身體),但我想驗證WCF是否從線路收到此請求。 我該怎麼做? 理想情況下,我會在System.ServiceModel.Dispatcher.IErrorHandler這樣的錯誤處理程序中記錄傳入的請求(原始字節),否則在某處收集數據,然後在發生錯誤時記錄它們(某種類型的低級別http流量代理服務器端?)。

另一種解決方案可以在服務器站點上安裝Wireshark,但我更願意避免它,因爲它發生在客戶站點上,我無法訪問她的機器。

謝謝!

+2

您是否嘗試過WCF消息日誌? http://msdn.microsoft.com/en-us/library/ms730064.aspx – kmp 2012-04-03 16:58:46

+0

還沒有。據我瞭解,它會記錄消息,而不是原始請求。如果我沒有找到另一種方法來記錄我的日誌文件中的傳入數據,我會試着定義它。 – 2012-04-03 17:04:59

+0

沒錯,它不會給你那種使用wireshark獲得的原始TCP視圖,但它應該告訴你WCF在拋出異常時試圖去鈍化的消息,並且應該能夠從那裏恢復以查找發生了什麼如果您有客戶端和服務端日誌進行比較。 – kmp 2012-04-03 17:11:57

回答

0

我想,我發現好一點點複雜的解決方案。如果您需要執行類似問題中的問題,則需要執行MessageEncoder並通過MessageEncodingBindingElement進行安裝。在MessageEncoder中覆蓋ReadMessage(...)方法,您將有權訪問包含原始傳入正文的緩衝區。