Обрабатывать куки до того, как какое-либо действие контроллера будет вызвано в ASP.NET MVC - PullRequest
5 голосов
/ 11 марта 2011

Где я могу поместить некоторый код, который будет выполнен перед выполнением какого-либо действия контроллера?

Я пытаюсь заменить сеанс ASP.NET по умолчанию, и мне нужно сделать это до того, как будут выполнены какие-либо действия контроллера: получить коллекцию файлов cookie и проверить, есть ли у меня новый посетитель без файлов cookie, - тогда я бы добавил новый файл cookie с идентификатором сеанса, который будет доступен для контроллеров. В противном случае (если файл cookie с идентификатором сессии уже существует) я ничего не буду делать.

Где я могу разместить код, который будет это делать?

Ответы [ 5 ]

4 голосов
/ 13 марта 2011

Я делаю это в Global.asax.cs

protected void Application_BeginRequest(object sender, EventArgs e)
{
            var c = Request.Cookies["lang"];
...
}
3 голосов
/ 11 марта 2011

Пользовательский IHttpModule сделает свое дело.

3 голосов
/ 11 марта 2011

Есть несколько мест, где вы могли бы сделать это, я бы сказал, что лучшее место было бы в ActionFilter, переопределяя событие OnActionExecuting.Если вы хотите, чтобы это произошло в первую очередь, тогда вы захотите добавить параметр «Порядок» при его применении.

Если вы хотите, чтобы все ваши контроллеры имели, тогда вы можете применить этот фильтр к базовому классу или просто переопределить метод OnActionExecuting базового класса.

Какпримечание: для максимальной тестируемости вы, вероятно, должны иметь свой , а не прямой доступ к коллекции файлов cookie в запросе;эта информация (при необходимости) должна поступать в метод действия в качестве параметра или свойства контроллера, который вы можете установить в тестах.

Если вам нужно подключиться к жизненному циклу раньше, чем OnActionExecuting (по любой причине) вы также можете создать собственную ControllerFactory, но я думаю, что это, вероятно, излишне, если учитывать ваше описание.

2 голосов
/ 12 марта 2011

ASP.NET MVC 3 теперь имеет фильтры глобальных действий, которые будут работать для каждого контроллера:

Обзор Скотта Гатри: 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

0 голосов
/ 03 августа 2017

На вашем 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
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...