我有一个 MVC3 应用程序,我向其中添加了几个简单的缓存变量作为属性。我在 Application_Start
中添加我的数据,然后在 Controller 中尝试将 HttpContext.ApplicationInstance
转换回我的类型以访问它。但是,该属性始终为空。这是一个例子:
编辑为工作示例
public interface IMyMvcApp
{
Hashtable Cache {get;set;}
}
public class MvcApplication: HttpApplication, IMyMvcApp
{
public Hashtable Cache
{
get { return Context.Cache["MyStuff"] as Hashtable; }
set { Context.Cache["MyStuff"] = value}
}
public void Application_Start()
{
Cache = new Hashtable();
Cache.Add("key", new object());
}
}
public class AController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext context)
{
var myApp = context.HttpContext.ApplicationInstance as IMyMvcApp;
Assert.IsNotNull(myApp.Cache);
}
}
最佳答案
框架创建了多个应用程序实例。要验证这一点,请添加一个空构造函数并在其中放置一个断点。您会看到此构造函数将被多次命中,而 Application_Start 只会被命中一次。
因此,与其重新发明轮子,不如使用框架中已经内置的 Cache 对象:
protected void Application_Start()
{
...
Context.Cache["key"] = new object();
}
然后:
protected override void OnActionExecuting(ActionExecutingContext context)
{
var value = context.HttpContext.Cache["key"];
}
关于c# - 为什么我的 HttpApplication 实例变量为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230912/