2013-07-29 93 views
0

My Servicestack服務正在發佈Json(由jquery提供)。 (:用戶名: - >用戶ID = FOO在DTO '富' 例如)訪問json的Servicestack

sendData = function(dataToSend) { 
    var request; 
    return request = $.ajax({ 
    url: "/api/test", 
    type: "post", 
    data: JSON.stringify(dataToSend), 
    dataType: "json", 
    accept: "application/json", 
    contentType: "application/json" 
    }); 

JSON數據,如果它對應於我的DTO的根屬性被正確地反序列化。

我想訪問原始的json發佈數據,然後將其反序列化以添加自定義反序列化。 到目前爲止,使用自定義過濾器(RequestFilterAttribute)訪問查詢字符串或者如果數據輸出類似於表單,我沒有任何問題。 現在我看到使用Chrome開發人員工具發佈的數據位於帶有「Request Payload」的標頭中,因此在調試我的IHttpRequest時,它既不是FormData也不是QueryString。 如何在過濾器中獲取原始json數據?

+0

如果我正確理解這一點,您希望在ServiceStack嘗試訪問之前訪問原始請求主體數據將它反序列化爲一個請求的DTO對象? –

+0

是的。如果我發佈內容類型application/x-www-form-urlencoded,我可以在過濾器屬性代碼中調試時看到數據,如果我使用GET而不是POST,則在查詢字符串參數中看到它。 – Ronnie

回答

2

如果要替換自定義行爲默認的反序列化行爲的具體要求DTO,你可以在你APPHOST設置代碼做到這一點:

JsConfig<MyRequestDtoClass>.DeSerializeFn = DeserializeMyRequestDto; 

DeserializeMyRequestDto是一個函數或lambda採取一個字符串參數:param - 原始請求主體 - 並返回你的DTO的反序列化實例:

MyRequestDtoClass DeserializeMyRequestDto(string rawBody) { ... } 

RequestFilterAttribute子purpotedly必須訪問原始的請求主體使用request.GetRawBody(),其中request是傳遞給過濾器的Execute方法的IHttpRequest對象。但根據我的經驗,GetRawBody返回一個空字符串,因爲由於反序列化,請求輸入流似乎在那段時間被消耗。我通過在BeginRequest事件處理程序中創建一個HTTP模塊(在AppHost中通過DynamicModuleUtility.RegisterModule註冊)來「查看」請求輸入流,從而解決了這個問題。 (「peek」函數將讀取請求輸入流,然後將流的Position重置爲最初的位置。)