我implimenting使用Singleton模式我自己的ApplicationContext类。 我想我对它的实例存储在HttpContext.Items,因为它是在要求各地访问。 我一直在阅读有关使用的HttpContext的ASP.NET MVC和主要的痛苦之一是,它引入了测试的复杂性。 我试过在HttpContext.Items的可测试性进行研究,但所有我能找到的东西会话。 其中一个我发现的唯一的东西就是出在专业ASP.NET MVC 3.5书Wrox的样章(共这里PDF链接 )。 第15页就这样说:
是你无法使用:HttpContext.Items
上述在本节中,我们来了干净,告诉你,我们对你撒谎:HttpContext的不ASP.NET MVC和ASP.NET Web窗体之间共享。 作为这样的结果,你不能使用HttpContext.Items集合来存储和检索数据的比特。
这样做的原因是因为一旦您重定向到一个控制器,你的HttpHandler成为System.Web.Mvc.MvcHandler,这是使用HttpContextWrapper创建的,这将有自己的HttpContext.Current的定义。 不幸的是,这个握手过程中,像HttpContext.Items不会转移。
这是什么归结为是,HttpContext的类型,尽管看起来和探空大同小异,都是不一样的,你不能用这种方式传递数据。
现在,我试着测试此出,而据我所知,如果你使用RedirectToAction,HttpContext.Items不会保留重定向到另一个控制器。 我使用的是默认的ASP.NET MVC项目来测试这一点。 我所做的是,这种方法添加到Global.asax.cs中:
protected void Application_BeginRequest()
{
Context.Items["Test"] = "Hello World";
}
而在HomeController.cs,我已经改变了指数的方法:
public ActionResult Index()
{
return RedirectToAction("About");
}
并改变了关于方法:
public ActionResult About()
{
Response.Write(Convert.ToString(HttpContext.Items["Test"]));
return View();
}
当我运行应用程序,页面重定向正确到/ home /关于和Response.Writes正确的“Hello World”的字符串中的global.asax.cs设置。
所以,在我看来,就好像我要么不理解什么时,他们说“之类的东西HttpContext.Items不会转移”或它传递这个东西,也没关系使用HttpContext.Items书上的意思。
如果你们推荐我避免HttpContext.Items,有没有存放在每个请求的基础跨请求对象的另一个替代方式?