2015-10-18 49 views
1

我創建了幾個WCF REST服務,它們接受JSON對象請求並返回JSON對象響應。獲取WCF REST服務的RAW請求字符串

Public Function SaveClientInformation(info as ClientInformation) As Boolean Implements IContactInformation.SaveClientInformation 
    'Here info object is the de-serialized JSON that was sent 

    'At this point we also need access to the RAW JSON string that was sent from the Java client 
    dim rawJSONRequest = ? 

    'We take the info object and persist it out postgress database 

End Function 

我需要從Web服務方法捕獲原始JSON字符串。 目前我有權訪問反序列化的對象,但我還需要提交給Web服務的RAW JSON字符串。

我已經看過WCF文檔並環顧四周,不幸的是這似乎不可能。 WCF不允許我訪問發送到服務器的RAW請求(字符串)。

我已經嘗試創建一個WCF消息攔截器,但是這並不能讓我訪問RAW請求字符串,我也需要從Web服務方法訪問這個RAW字符串。

我需要訪問RAW字符串以及來自Web服務方法的反序列化的JSON對象。

這是可能的WCF?

我知道這可以使用較新的ASP.NET Web API來實現。但我無法更改我們的應用程序,因爲我們的所有Web服務都是基於WCF REST(JSON)構建的,並且它們被許多客戶端使用。

RAW請求是必需的,因爲在客戶端,請求RAW字符串由Java散列,並且散列在標頭中發送。因此訪問這個RAW請求的主要原因是重新計算哈希以檢查在傳輸過程中消息是否未被更改。我們正在使用HTTP,但是我們需要保證消息不被幹擾,這是我們其他Java Web服務中已經實現的技術,我們需要在.NET中完成確切的事情。 WCF REST也是如此。

+0

可以使用代碼 –

+0

增加更多的細節希望示例代碼就足夠了。請讓我知道你還需要什麼,非常感謝你的幫助。 –

+0

根本沒有請求字符串。在WCF管道中的某個點,你有請求字節(byte []),然後由消息編碼器讀取,然後轉換爲消息對象。即使您在消息攔截器中訪問這些字節,這也會是不同的層,這與業務邏輯層無關。考慮將輸入參數類型更改爲字符串(如果可能),並在服務端自己將其解析爲JSON。 – Mimas

回答

0

您可以通過閱讀Request.InputStream來訪問請求內容。 這需要在Web.Config中打開aspNetCompatibilityEnabled =「true」設置。

見下文:

Dim requestContent = [String].Empty 
    Dim requestStream = System.Web.HttpContext.Current.Request.InputStream 
    Dim originalPosition = requestStream.Position 

    Using reader = New System.IO.StreamReader(requestStream) 
     requestContent = reader.ReadToEnd() 
    End Using 

    requestStream.Seek(originalPosition, SeekOrigin.Begin) 
    Return requestContent 
+0

謝謝先生,工作 –