2011-03-11 50 views
5

我可以在哪裏放置一些將在任何控制器操作執行之前執行的代碼?在ASP.NET MVC中調用任何控制器操作之前處理cookie

我試圖替換默認的ASP.NET會話,我需要在任何控制器操作發生之前這樣做: 獲取cookie集合,並檢查是否有新的訪問者沒有cookie - 比我添加新的「會話ID」cookie將不可用於控制器。否則(如果已經有一些「會話ID」cookie)我什麼都不會做。

我在哪裏可以放置這樣做的代碼?

回答

3

有很多地方你可以做到這一點,我會說最好的地方將在一個ActionFilter,重寫OnActionExecuting事件。如果您希望它首先發生,那麼您在應用它時會添加「訂單」設置。

如果你想所有你的控制器擁有它,那麼你可以該過濾器適用於一個基類,或者只是覆蓋基類的OnActionExecuting方法。作爲一個方面說明,爲了獲得最大的可測性,你可能應該讓你的不是直接訪問請求中的cookies集合;該信息(如果需要的話)應作爲參數或作爲控制器上可以在測試中設置的屬性進入操作方法。

如果您需要連接到比OnActionExecuting更早的生命週期(出於任何原因),您也可以創建一個自定義的ControllerFactory,但我認爲這可能矯枉過正地描述您的描述。

+0

對不起劫持,但你讓我思考。如果出於某種原因,我想將一個cookie值放入路由值中作爲操作方法的參數,我可能想在新的基礎控制器的OnActionExecuting中做到這一點?或者在決定使用哪種操作方法時,它已經太晚了? – patridge 2011-03-11 18:41:47

+0

@patridge:在我的情況下,我不需要操縱或改變哪個動作方法將被調用。我只需要把一些東西放到Cookies集合中......但是也許你總是問這個問題(比你可能考慮創建你自己的問題) – drasto 2011-03-11 19:25:12

+0

@patridge> afaik,你將在這種情況下注冊一個自定義的IValueProvider,以提取它們,讓它們用於路由和模型綁定(不是肯定的,但非常確定)。你也可以使用ActionSelectionAttribute去做你正在尋找的東西,但是它們比任何非平凡的東西都更值錢。 – Paul 2011-03-11 20:45:53

3

自定義IHttpModule將做的伎倆。

+0

我是否可以從'IHttpModule'實現類獲得'Request'屬性,或者是否有任何其他方式從實現類中獲取'HttpRequest'實例?我需要它能夠收集餅乾。 – drasto 2011-03-11 16:29:15

+0

看起來像你會。在來自MSDN鏈接的示例中,他們通過事件源參數在實現中得到它。例如,在他們的'HttpApplication.BeginRequest'處理程序中:'((HttpApplication)source).Context.Request'。 – patridge 2011-03-11 18:37:08

4

我這樣做是在全球。 asax.cs

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
      var c = Request.Cookies["lang"]; 
... 
} 
0

在您的Global.asax:

protected void Application_Start() 
     { 
      GlobalConfiguration.Configure(WebApiConfig.Register); 
      RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); 
     } 

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters) 
     { 
      filters.Add(new CredentialsActionFilter()); 
     } 

的CredentialsActionFilter類:

public override void OnActionExecuting(HttpActionContext actionContext) 
     { 
      var cookies = actionContext.Request.Headers.GetCookies("credentials").FirstOrDefault(); 
      string username = cookies.Cookies.Where(c => c.Name == "username").FirstOrDefault().Value; 
      actionContext.Request.Properties.Add("username", username); // so you can access the value from within your actions 
     } 
相關問題