2012-08-14 41 views
2

我使用自定義過濾器來驗證內容類型,如:ASP .Net網絡API定製過濾器和HTTP動詞

 public override void OnActionExecuting(HttpActionContext httpActionContext) 
     { 
      List<String> errors = new List<String>(); 

      // a 
      if (httpActionContext.Request.Content.Headers.ContentType.MediaType == "application/json") 
      { 
      } 
      else 
      { 
       errors.Add("Invalid content type."); 
      } 

       // more checks 
     } 

上面的代碼工作正常,但驗證應該檢查請求的HTTP動詞,因爲它應該驗證內容類型僅用於put或post。我不想從httpget動作中刪除自定義過濾器,因爲我在裏面有更多的檢查,我不想將過濾器分成兩部分,這意味着我必須檢查過濾器中的http動詞,但我可以不知道如何。

任何提示?

+0

你爲什麼試圖限制數據的媒體表示?開箱即用支持XML和JSON,並且媒體處理程序會將您的表示轉換爲強類型對象。您可能會更好地使API與其接受的媒體類型進行通信,並在必要時返回錯誤請求錯誤。 – Oppositional 2012-08-14 15:12:14

+0

因爲我們只支持json(文檔,版本控制等)。 – user1330271 2012-08-14 15:19:51

+0

我想這取決於你,但是支持多種媒體類型並讓web API處理對象轉換格式的能力不是我輕易放棄的。 – Oppositional 2012-08-14 16:02:33

回答

5

可以從此獲得方法類型(POST或認沽):

public override void OnActionExecuting(HttpActionContext actionContext) 
{ 
    string methodType = actionContext.Request.Method.Method; 
    if (methodType.ToUpper().Equals("POST") 
      || methodType.ToUpper().Equals("PUT")) 
    { 
     // Your errors 
    } 
} 
+0

這是一個商業API,我們將只提供json的支持和文檔。我們不會支持任何與xml相關的東西。這是一項業務需求。 – user1330271 2012-08-14 15:54:49

+0

@ user1330271:我知道了 – 2012-08-14 15:58:35

+1

@ user1330271如果你「不支持任何與xml相關的東西」,那麼爲了完全刪除XML,你可以在配置文件中刪除XML格式:void ConfigureApi(HttpConfiguration config){//移除XML formatter config .Formatters.Remove(config.Formatters.XmlFormatter); } – 2012-08-14 20:11:19

-1

在動作過濾器的構造函數中,可以傳入將設置OnActionExecuting邏輯的設置的選項/命名參數。根據這些設置,您可以切換邏輯。

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    private HttpVerbs mOnVerbs; 

    public MyActionFilterAttribute(HttpVerbs onVerbs) 
    { 
     mOnVerbs = onVerbs; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var currentVerb = filterContext.HttpContext.Request.HttpMethod; 

     if (mOnVerbs.HasFlag(HttpVerbs.Post)) { } 
     else if (mOnVerbs.HasFlag(HttpVerbs.Get)) { } 
     base.OnActionExecuting(filterContext); 
    } 
} 

[MyActionFilter(HttpVerbs.Get | HttpVerbs.Post)] 
public ActionResult Index() 
{ 
} 
+0

你的答案是MVC而不是WebAPI – Korayem 2015-11-21 16:26:18

3

如果你需要獲得通過過濾器正在驗證的請求的HTTP方法,你可以檢查方法請求的性質:

var method = actionContext.Request.Method; 

不過我建議你打破過濾器分開,因爲你是迅速朝泥場景的大球頭球。

0

你真的應該用你上面的控制器方法HTTPVerb屬性的標準:

[HttpGet] 
[HttpPut] 
[HttpPost] 
[HttpDelete] 
[HttpPatch] 

MVC控制器多:

[AcceptVerbs(HttpVerbs.Get, HttpVerbs.Post)] 

的WebAPI Controlelrs多個

[AcceptVerbsAttribute("GET", "POST")]