2011-03-11 36 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 
     } 
相关问题