在ASP.NET MVC中调用任何控制器操作之前处理cookie

时间:2011-03-11 16:05:48

标签: c# .net asp.net asp.net-mvc cookies

在执行任何控制器操作之前,我可以在哪里放置一些代码?

我正在尝试替换默认的ASP.NET Session,我需要在执行任何控制器操作之前执行此操作: 获取cookie集合并检查我是否有新访问者没有cookie - 而不是我添加新的“会话ID”cookie,这将不是控制器可用的。否则(如果已经有一些“会话ID”cookie)我将不会做任何事情。

我可以在哪里放置执行此操作的代码?

5 个答案:

答案 0 :(得分:4)

我在Global.asax.cs

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

答案 1 :(得分:3)

有很多地方可以做到这一点,我会说最好的地方是在ActionFilter中,覆盖OnActionExecuting事件。如果您希望它首先发生,那么您将需要在应用它时添加订单设置。

如果你希望所有你的控制器拥有它,那么你可以将该过滤器应用于基类,或者只是覆盖基类的OnActionExecuting方法。

作为旁注,为了获得最大的可测试性,您可能应该让直接访问请求中的cookie集合;该信息(如果需要)应作为参数或控制器中的属性进入操作方法,您可以在测试中设置。

如果您需要比OnActionExecuting更早地连接到生命周期(出于任何原因),您还可以创建一个自定义的ControllerFactory,但我认为这可能会对您的描述造成过度杀伤。

答案 2 :(得分:3)

自定义IHttpModule可以解决问题。

答案 3 :(得分:2)

ASP.NET MVC 3现在具有将为每个控制器运行的全局操作过滤器:

Scott Guthrie的概述:http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx
有关过滤器类型的MSDN详细信息:http://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx

答案 4 :(得分: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
        }