我可以在哪里放置一些将在任何控制器操作执行之前执行的代码?在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