2014-10-29 27 views
4

我已經搜索了很多很好的答案,但得到了很多答案,不滿足我。Wcf從操作中獲得原始請求

我們有一個平常的操作服務。在每個操作中,我們調用一個不同的項目來處理操作,並將操作的一些信息存儲在數據庫中。

我們有一個新的要求:將操作的soap消息存儲在數據庫中。是否有可能從wcf操作接收soap(xml)?還是事件真的需要?

+0

如果我沒有弄錯,並且如果WCF通過HTTP進行通信,則可以通過上下文-'HttpContext.Current.Request.InputStream'獲取輸入流,並將其讀取並保存到某處。 – 2014-10-29 09:38:47

+0

我試過了,Request.InputStream給出了以下例外: 在調用HttpRequest.GetBufferlessInputStream後,不支持此方法或屬性。 – PcPulsar 2014-10-29 09:43:50

+0

既然你調用'GetBufferlessInputStream',那麼你已經獲得了請求流,對吧?你難道不能保存它嗎? – 2014-10-29 09:54:13

回答

4

至於我自己,我發現這個解決方案框架4.5,以獲得原始SOAP消息:

OperationContext.Current.RequestContext.RequestMessage.ToString() 

閱讀上述所有評論關於替代品和他們的問題的更多細節。

2

我無法使用OperationContext.Current.RequestContext.RequestMessage.ToString(),因爲它將請求轉換爲Xml。當請求是JSON時,我寧願保持這種方式。我還發現,在端點方法被調用的時候,Request.InputStream是空的 - 即使我在web.config中有<add key="wcf:serviceHostingEnvironment:useClassicReadEntityBodyMode" value="true" />(FYI:應用程序正在運行.Net 4.5.2)。

因此,我所做的是在Global.asax.cs中實現Application_BeginRequest。我在那裏提取Request.InputStream的內容,並將請求主體保存到Context.Items。稍後,在IErrorHandlerProvideFault(...)中,我將保存的字符串轉移到異常的Data屬性,以便日誌記錄稍後將在HandleError(...)運行時捕獲它(Items在運行時爲HandleError時爲空)。