Tôi đang sử dụng lớp ApplicationContext của riêng mình sử dụng mẫu đơn. Tôi muốn lưu trữ cá thể của nó trong HttpContext.Items, vì nó có thể truy cập được trong tất cả các phần của yêu cầu. Tôi đã đọc về cách sử dụng HttpContext với ASP.NET MVC và một trong những nỗi đau lớn là nó giới thiệu độ phức tạp thử nghiệm. Tôi đã thử làm nghiên cứu về testability của HttpContext.Items, nhưng tất cả những gì tôi có thể tìm thấy là các công cụ trên Session. Một trong những điều duy nhất tôi đã tìm thấy là trong một chương mẫu trong cuốn sách chuyên nghiệp ASP.NET 3.5 MVC trên Wrox (pdf link here). Trên trang 15 nó nói này:HttpContext.Items với ASP.NET MVC
Something Bạn không thể sử dụng: HttpContext.Items
Trên trong phần này, chúng tôi đã sạch và nói với bạn rằng chúng tôi đã nói dối với bạn: HttpContext không được chia sẻ giữa ASP .NET MVC và ASP.NET Web Forms. Kết quả là, bạn không thể sử dụng bộ sưu tập HttpContext.Items để lưu trữ và truy xuất các bit dữ liệu.
Lý do cho điều này là vì một khi bạn chuyển hướng đến một Controller, HttpHandler của bạn sẽ trở thành System.Web.Mvc.MvcHandler, được tạo ra bằng cách sử dụng HttpContextWrapper, sẽ có định nghĩa riêng của HttpContext.Current. Thật không may, trong quá trình bắt tay này, những thứ như HttpContext.Items không được chuyển.
Điều này tóm tắt là các loại HttpContext, mặc dù tìm kiếm và nghe rất giống nhau, không giống nhau, và bạn không thể truyền dữ liệu theo cách này.
Bây giờ, tôi đã thử kiểm tra điều này, và theo như tôi có thể nói, nếu bạn chuyển hướng đến bộ điều khiển khác bằng cách sử dụng RedirectToAction, HttpContext.Items vẫn còn. Tôi đang sử dụng dự án ASP.NET MVC mặc định để kiểm tra điều này. Những gì tôi đã làm là, thêm phương pháp này để Global.asax.cs:
protected void Application_BeginRequest()
{
Context.Items["Test"] = "Hello World";
}
Và trong HomeController.cs, tôi đã thay đổi phương pháp Chỉ số:
public ActionResult Index()
{
return RedirectToAction("About");
}
Và thay đổi Về phương pháp để:
public ActionResult About()
{
Response.Write(Convert.ToString(HttpContext.Items["Test"]));
return View();
}
Khi tôi chạy các ứng dụng, trang đúng cách chuyển hướng đến/Home/Giới và Response.Writes chuỗi đúng "Hello World" thiết lập trong global.asax.cs. Vì vậy, có vẻ như với tôi như thể tôi hoặc là không hiểu những gì cuốn sách có ý nghĩa khi họ nói "những thứ như HttpContext.Items không được chuyển giao" HOẶC nó chuyển giao công cụ này và nó okay để sử dụng HttpContext. Mặt hàng.
Nếu bạn đề nghị tôi tránh HttpContext.Items, có cách nào khác để lưu trữ một đối tượng trên một yêu cầu trên cơ sở theo yêu cầu không?
Đây là một nguồn lực khá hữu ích cho việc tạo ra một "bối cảnh ứng dụng" loại đối tượng: http://jcapka.blogspot.co.uk/2013/11/creating-application-context-for-net.html – JDandChips