HttpContext.Items с ASP.NET MVC

Я использую свой собственный класс ApplicationContext, который использует шаблон синглтона. Я хочу сохранить свой экземпляр в HttpContext.Items, поскольку он доступен во всех частях запроса. Я читал об использовании HttpContext с ASP.NET MVC, и одна из основных проблем заключается в том, что он вводит сложность тестирования. Я пытался исследовать тестируемость HttpContext.Items, но все, что я могу найти, - это материал на Session. Единственное, что я обнаружил, - это пример главы в книге Professional ASP.NET 3.5 MVC по Wrox (pdf ссылка здесь). На странице 15 говорится следующее:

Something You Can’t Use: HttpContext.Items
Above in this section, we came clean and told you that we lied to you: HttpContext is not shared between ASP.NET MVC and ASP.NET Web Forms. As a result of this, you cannot use the HttpContext.Items collection to store and retrieve bits of data.

The reason for this is because once you redirect to a Controller, your HttpHandler becomes the System.Web.Mvc.MvcHandler, which is created using HttpContextWrapper, which will have its own definition of HttpContext.Current. Unfortunately, during this handshake, things like HttpContext.Items are not transferred.

What this boils down to is that the HttpContext types, despite looking and sounding very much the same, are not the same, and you cannot pass data in this way.

Теперь я попытался проверить это, и, насколько я могу судить, если вы перенаправляете на другой контроллер с помощью RedirectToAction, HttpContext.Items остается. Я использую проект ASP.NET MVC по умолчанию, чтобы проверить это. Я только что добавил этот метод в Global.asax.cs:

protected void Application_BeginRequest()
{
    Context.Items["Test"] = "Hello World";
}

А в HomeController.cs я изменил метод Index на:

public ActionResult Index()
{
    return RedirectToAction("About");
}

И изменил метод О:

public ActionResult About()
{
    Response.Write(Convert.ToString(HttpContext.Items["Test"]));
    return View();
}

Когда я запускаю приложение, страница правильно перенаправляется в / Home / About и Response. Записывает правильный & quot; Hello World & quot; строка, заданная в global.asax.cs.

Таким образом, мне кажется, что я либо не понимаю, что означает книга, когда они говорят  & quot; такие вещи, как HttpContext.Items не передаются & quot; ИЛИ это передает этот материал, и все в порядке, чтобы использовать HttpContext.Items.

Если вы, ребята, порекомендуете мне избегать HttpContext.Items, есть ли другой альтернативный способ хранения объекта в запросе на основе запроса?

Ответы на вопрос(3)

Ваш ответ на вопрос