我正在使用单例模式我自己的ApplicationContext类.我想将它的实例存储在HttpContext.Items中,因为它可以在请求的所有部分中访问.我一直在阅读将HttpContext与ASP.NET MVC一起使用,其中一个主要问题是它引入了测试复杂性.我已经尝试过对HttpContext.Items的可测试性进行研究,但我能找到的就是Session上的内容.我发现的唯一一件事是在Wrox上的Professional ASP.NET 3.5 MVC书中的一个示例章节(这里是pdf链接).在第15页,它说:
你不能使用的东西:HttpContext.Items
在本节的上面,我们来了,告诉你我们骗了你:ASP.NET MVC和ASP.NET Web Forms之间没有共享HttpContext.因此,您无法使用HttpContext.Items集合来存储和检索数据位.
这是因为一旦你重定向到一个Controller,你的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";
}
Run Code Online (Sandbox Code Playgroud)
在HomeController.cs中,我将Index方法更改为:
public ActionResult Index()
{
return RedirectToAction("About");
}
Run Code Online (Sandbox Code Playgroud)
并将About方法更改为:
public ActionResult About()
{
Response.Write(Convert.ToString(HttpContext.Items["Test"]));
return View();
}
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,页面正确地重定向到/ Home/About和Response.Writes在global.asax.cs中设置正确的"Hello World"字符串.
所以,在我看来,当他们说"像HttpContext.Items这样的东西没有转移"时,我或者不理解这本书是什么意思,或者它确实转移了这些东西,并且可以使用HttpContext.Items.
如果你们建议我避免使用HttpContext.Items,是否有另一种方法可以在每个请求的基础上跨请求存储对象?
你如何解释MongoDB中的独特查询?
db.test3.distinct("id", { key:"value"}).explain()
Run Code Online (Sandbox Code Playgroud)
错误:
explain is not a function (shell)
Run Code Online (Sandbox Code Playgroud) 我想通过会话状态仅为一个请求存储一些对象.我似乎无法想到一个简单的方法来实现这一目标.这正是 ASP.NET MVC的TempData对象所做的.任何人都可以向我提供一个链接或一些如何让一个对象处于会话状态的例子只能存活一个额外的请求吗?
我在想,这可以通过制作一个自定义字典对象来实现,该对象存储每个项目的年龄(请求数).通过订阅Application_BeginRequest和Application_EndRequest方法,您可以执行所需的对象清理.这甚至可能有助于创建一个存储X请求数据的对象,而不仅仅是一个.这是正确的轨道吗?