我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