我可以在哪裏放置一些將在任何控制器操作執行之前執行的代碼?在ASP.NET MVC中調用任何控制器操作之前處理cookie
我試圖替換默認的ASP.NET會話,我需要在任何控制器操作發生之前這樣做: 獲取cookie集合,並檢查是否有新的訪問者沒有cookie - 比我添加新的「會話ID」cookie將不可用於控制器。否則(如果已經有一些「會話ID」cookie)我什麼都不會做。
我在哪裏可以放置這樣做的代碼?
我可以在哪裏放置一些將在任何控制器操作執行之前執行的代碼?在ASP.NET MVC中調用任何控制器操作之前處理cookie
我試圖替換默認的ASP.NET會話,我需要在任何控制器操作發生之前這樣做: 獲取cookie集合,並檢查是否有新的訪問者沒有cookie - 比我添加新的「會話ID」cookie將不可用於控制器。否則(如果已經有一些「會話ID」cookie)我什麼都不會做。
我在哪裏可以放置這樣做的代碼?
ASP.NET MVC 3現在有這將爲每個控制器上運行的全球行動過濾器:在過濾器類型http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx
MSDN細節:
斯科特Guthrie的概述http://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx
有很多地方你可以做到這一點,我會說最好的地方將在一個ActionFilter,重寫OnActionExecuting事件。如果您希望它首先發生,那麼您在應用它時會添加「訂單」設置。
如果你想所有你的控制器擁有它,那麼你可以該過濾器適用於一個基類,或者只是覆蓋基類的OnActionExecuting方法。作爲一個方面說明,爲了獲得最大的可測性,你可能應該讓你的不是直接訪問請求中的cookies集合;該信息(如果需要的話)應作爲參數或作爲控制器上可以在測試中設置的屬性進入操作方法。
如果您需要連接到比OnActionExecuting更早的生命週期(出於任何原因),您也可以創建一個自定義的ControllerFactory,但我認爲這可能矯枉過正地描述您的描述。
自定義IHttpModule將做的伎倆。
我這樣做是在全球。 asax.cs
protected void Application_BeginRequest(object sender, EventArgs e)
{
var c = Request.Cookies["lang"];
...
}
在您的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
}
對不起劫持,但你讓我思考。如果出於某種原因,我想將一個cookie值放入路由值中作爲操作方法的參數,我可能想在新的基礎控制器的OnActionExecuting中做到這一點?或者在決定使用哪種操作方法時,它已經太晚了? – patridge 2011-03-11 18:41:47
@patridge:在我的情況下,我不需要操縱或改變哪個動作方法將被調用。我只需要把一些東西放到Cookies集合中......但是也許你總是問這個問題(比你可能考慮創建你自己的問題) – drasto 2011-03-11 19:25:12
@patridge> afaik,你將在這種情況下注冊一個自定義的IValueProvider,以提取它們,讓它們用於路由和模型綁定(不是肯定的,但非常確定)。你也可以使用ActionSelectionAttribute去做你正在尋找的東西,但是它們比任何非平凡的東西都更值錢。 – Paul 2011-03-11 20:45:53