我implimenting我自己的ApplicationContext类使用Singleton模式。我想将它的实例存储在HttpContext.Items中,因为它可以在请求的所有部分访问。我一直在阅读关于在ASP.NET MVC中使用HttpContext的问题,其中一个主要问题是它引入了测试复杂性。我试过对HttpContext.Items的可测试性进行研究,但我能找到的是Session上的东西。我发现的唯一一件事是在Wrox专业ASP.NET 3.5 MVC书籍(pdf link here)中的示例章节之外。第15页就这样说:HttpContext.Items与ASP.NET MVC
是你无法使用: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。项目。
如果你们推荐我避免HttpContext.Items,有没有存放在每个请求的基础跨请求对象的另一个替代方式?
这是创建一个“应用程序上下文”类型的对象非常有用的资源:http://jcapka.blogspot.co.uk/2013/11/creating-application-context-for-net.html – JDandChips 2015-03-12 09:31:04