2015-09-09 105 views
0

Web API方法中的一個參數意外爲空,因此我想檢查該請求。爲了支持這個,我寫了一個ActionFilterAttribute並實現了OnActionExecuting方法。試圖根據下面的代碼檢索內容會返回一個空字符串,但ContentLength表示內容爲345字節,內容類型爲JSON(如預期的那樣)。ActionFilter中的嗅探請求

using System.Diagnostics; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web.Http.Controllers; 
using System.Web.Http.Filters; 

namespace Website.ActionFilters 
{ 
    public class ActionFilterSniffAttribute : ActionFilterAttribute 
    { 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     Task<string> task = actionContext.Request.Content.ReadAsStringAsync(); 
     while (task.Status != TaskStatus.RanToCompletion) 
     Thread.Sleep(10); 
     Debug.WriteLine(task.Result); 
    } 
    } 
} 

獲取HTTP請求字符串的正確方法是什麼?在服務器上安裝Fiddler並不是我想做的事情。

+0

可能重複http://stackoverflow.com/questions/21351617/web-api-request-content-is-empty-in-action-filter。問題可能在於內容已被讀取以提供操作參數,並且僅向前讀取字符串。 – Bill

+0

檢查了下面的答案。作品是一種享受,所以對於另一個問題的回答絕對是錯誤的,只有這個流纔是正確的。 –

回答

0

這個機制對我來說很合適,對發生的事情很好解釋。

Web API action filter content can't be read

public override async void OnActionExecuting(HttpActionContext actionContext) 
    { 
     System.Net.Http.HttpRequestMessage request = actionContext.Request; 
     Stream reqStream = await request.Content.ReadAsStreamAsync(); 

     if (reqStream.CanSeek) 
     { 
      reqStream.Position = 0; 
     } 

     //now try to read the content as string 
     string data = await request.Content.ReadAsStringAsync(); 
     Debugger.Break(); 
    }