2013-10-22 184 views
0

我想實現自定義消息處理程序,該程序將檢查每個請求中必須存在的自定義標頭。ASP.NET Web API消息處理程序

如果我的自定義標題存在,請求將通過,如果標題不存在,則會觸發控制器,請求被自定義錯誤消息拒絕。

沒有我的問題是:如果我以這種方式實現我的處理程序,這意味着所有請求都必須具有標頭但是我需要有一個gate我可以在沒有該標頭的情況下調用,並且該請求必須被消息處理程序忽略,控制器,即使沒有自定義標題。

有沒有可能做到這一點?或者我怎麼能實現我的消息處理程序,將忽略某些特定的控制器調用或類似的東西......?

+1

你也許可以使用授權的過濾器或'路由specific'消息處理程序在這種情況下。 –

+0

我沒有看到這個門可以做的事情。因爲如果您在「http處理程序」或「http模塊」或「操作過濾器」中執行此自定義標頭的檢查。它將運行所有呼叫。也許你可以添加另外一個條件,比如如果某個查詢字符串或者cookie存在,那麼可以不用自定義頭文件 –

+0

實際上@KiranChalla是正確的,你可以像這裏一樣實現特定於路由的消息處理程序:http:// www。 asp.net/web-api/overview/working-with-http/http-message-handlers – user2818430

回答

0

你可以試試這個。(未經測試)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Http; 


public abstract class EnforceMyBusinessRulesController : ApiController 
{ 

    protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext) 
    { 

     /* 

      Use any of these to enforce your rules; 

      http://msdn.microsoft.com/en-us/library/system.web.http.apicontroller%28v=vs.108%29.aspx 

      Public property Configuration Gets or sets the HttpConfiguration of the current ApiController. 
      Public property ControllerContext Gets the HttpControllerContext of the current ApiController. 
      Public property ModelState Gets the model state after the model binding process. 
      Public property Request Gets or sets the HttpRequestMessage of the current ApiController. 
      Public property Url Returns an instance of a UrlHelper, which is used to generate URLs to other APIs. 
      Public property User Returns the current principal associated with this request. 
     */ 

     base.Initialize(controllerContext); 

     bool iDontLikeYou = true; /* Your rules here */ 
     if (iDontLikeYou) 
     { 
      throw new HttpResponseException(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NotFound)); 
     } 


    } 

} 



public class ProductsController : EnforceMyBusinessRulesController 
{ 

    protected override void Initialize(System.Web.Http.Controllers.HttpControllerContext controllerContext) 
    { 
     base.Initialize(controllerContext); 
    } 


} 
+0

我認爲這對於用戶所要求的東西來說是一種複雜的方法。 –

+0

我聽到你。提供一個簡單的(r)響應,我會讚揚它!我全部都是爲了學習新東西。 – granadaCoder