c# - 为什么我的 HttpApplication 实例变量为空?

标签 c# asp.net-mvc-3 httpcontext

我有一个 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/

相关文章:

c# - Youtube全屏在WinForms webBrowser中不起作用

c# - 没有默认构造函数的设计

c# - 使用 MySqlCommandBuilder 时更新 datagridview 中的时间值时日期值发生变化

jquery - Jquery UI 可选的自定义验证

C# ASP.NET MVC 模型绑定(bind)

c# - 将 CakeContext 传递给另一个 .cake 文件

asp.net-mvc-3 - FormsAuthentication cookie 不持久

c# - 确定global.asax中的request.islocal

ASP.NET MVC - 单元测试,模拟 HttpContext 而不使用任何模拟框架

c# - 在没有 System.Web 的情况下使用 OWIN 时使用什么代替 HttpContext