2013-02-24 137 views
0

對於概述here原因之前,我需要從他們每個請求的查詢字符串之前或FORMDATA審查一組值(這樣我就可以執行一些驗證)。密鑰每次都一樣,並且應該出現在每個請求中,但是它們將位於GET請求的查詢字符串中,以及用於POST和其他數據的查詢字符串中的ASP.NET Web API - 讀取查詢字符串/ FORMDATA每個請求

由於這是用於身份驗證的目的,因此需要運行請求前;目前我正在使用MessageHandler。

我可以計算出是否應該基於方法讀取querystring或formdata,何時它是GET,我可以使用Request.GetQueryNameValuePairs()讀取查詢字符串OK;然而問題是當它是一個POST時讀取formdata。

我可以使用Request.Content.ReadAsFormDataAsync()獲取formdata,但是formdata只能被讀取一次,並且當我在這裏讀取它時,它不再可用於請求(即,我的控制器動作獲取空模型)

什麼是最合適的方式一致和非侵入從請求讀取查詢字符串和/或FORMDATA它得到請求邏輯之前?

回答

1

關於你的哪個地方會是更好的問題,在這種情況下,我相信AuthorizationFilters比一個消息處理程序更好,但無論哪種方式,我看到的問題是涉及到多次讀取體。

後做事「的Request.Content.ReadAsFormDataAsync()」中的消息處理程序,你能嘗試做以下?

Stream requestBufferedStream = Request.Content.ReadAsStreamAsync().Result; 
requestBufferedStream.Position = 0; //resetting to 0 as ReadAsFormDataAsync might have read the entire stream and position would be at the end of the stream causing no bytes to be read during parameter binding and you are seeing null values. 

:請求的內容的能力是隻讀單次或多次取決於主機的緩存策略。默認情況下,主機的緩衝策略設置爲始終緩衝。在這種情況下,你將能夠位置重置爲0。但是,如果你明確做出的流式傳輸策略,那麼你就無法重置爲0。

+0

並稱作品: - 。 ' \t結果= request.Content.ReadAsFormDataAsync()結果; \t Stream requestStream = request.Content.ReadAsStreamAsync()。Result; \t requestStream.Position = 0; ' 您對緩衝區政策評論...確實認爲,從應用的角度來看意味着它不會工作 如果在其上運行代碼的服務器具有策略設置爲流傳? – Aleks 2013-02-24 02:40:04

+1

是的..這是正確的...你可以嘗試一下,用本博客文章中提到的Streamed策略代替:http://blogs.msdn.com/b/kiranchalla/archive/2012/09/04/receiving-請求文件或數據功能於流傳輸模式-AT-A-web的API-service.aspx – 2013-02-24 04:51:04

0

怎麼樣使用ActionFilterAtrributes?

0

此代碼工作很適合我

public HttpResponseMessage AddEditCheck(Check check) 
{ 
    var request= ((System.Web.HttpContextWrapper)Request.Properties.ToList<KeyValuePair<string, object>>().First().Value).Request; 

    var i = request.Form["txtCheckDate"]; 
    return Request.CreateResponse(HttpStatusCode.Ok); 
}