HttpContext.Items与ASP.NET MVC(HttpContext.Items wi

2019-06-26 01:42发布

我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,有没有存放在每个请求的基础跨请求对象的另一个替代方式?

Answer 1:

你的问题是问了一些东西,但我认为项目#1是您要寻找的答案。

  1. 它是蛮好用的Context.Items用于缓存的每个请求的依据是什么? 是。 如果在过程中,每个请求,每台机器Web场中的是你的条件那么Context.Items给你。

  2. Context.Items难以测试? 至于可测试性,我就躲在Context.Items某种类型的接口后面。 这样,你得到的单元测试功能,而无需引用Context.Items直接。 否则,你需要什么测试约Context.Items ? 该框架将存储和检索值? 保持你的代码无知System.Web ,你会成为一个快乐的人。

  3. Context.Items生存RedirectToAction ? 号您的测试是无效的。 它设置在每个Web请求“你好,世界”和您的测试跨越两个web请求。 第一种是当指数动作被调用。 二是当RedirectToAction动作称为(它是一个HTTP 302)。 为了使其失败,在设置索引操作一个新值,看看它是否保留在关于行动。



Answer 2:

使用TempData的字典,它主要用于存储操作重定向之间的对象:

public ActionResult Index()
{
    TempData.Add("Test", "Hello world");
    return RedirectToAction("About");
}

public ActionResult About()
{
    ViewData["Test"] = TempData["Test"];
    return View();
}

然后检索视图中的价值:

<%=ViewData["Test"] %>


Answer 3:

我做了一个测试和TempData的确实,确实,爆炸与会话状态禁用。 我唯一的建议是不要保存在临时数据对象本身,而是存储简单的类型化领域已建议。 既然你不序列化对象树它不应该是一个大的性能影响耗尽的进程。



文章来源: HttpContext.Items with ASP.NET MVC