首页 > 解决方案 > 调用 Application_Start() 后,Asp.Net MVC 应用程序属性始终为空

问题描述

我的 MVC 应用程序有以下 global.asax。每次请求开始时,我ApplicationContext都会在Application_BeginRequest(). 即使在ApplicationContext中正确实例化了Application_Start(),但每次Application_BeginRequest()调用时它都是空的。

public class MvcApplication : HttpApplication {

    /// <summary>
    /// Application context which can be accessed server wide. It contains Tokenfactory etc.
    /// </summary>
    public ApplicationContext ApplicationContext { get; private set; }

    /// <summary>
    /// Runs once when application starts.
    /// </summary>
    protected void Application_Start() {
        //STUFF...
        //........
        InitializeContext();
    }

    private void InitializeContext() {
        ApplicationContext = new ApplicationContext();
    }

    protected void Application_BeginRequest() {
        Context.Items.Add("TokenFactory", ApplicationContext.tokenFactory);
    }
}

额外信息:

如果我将此行更改为

public ApplicationContext ApplicationContext { get; private set; }

这➡(当然删除InitializeContext();:P)

public ApplicationContext ApplicationContext { get; } = new ApplicationContext();

它没有问题!这种行为的原因是什么?

标签: c#asp.netglobal-asax

解决方案


Application_Start()只触发一次,Application_BeginRequest()每次请求都会触发一次。在您的情况下ApplicationContext不是static,它只是在Application_Start(). 所以它只会在应用程序启动时可用,对于剩余的请求它将不可用。

如果它没有保持任何状态,您可以制作它static,或者在您收到的每个请求时再次初始化它。

public ApplicationContext ApplicationContext { get; } = new ApplicationContext();

它没有问题!这种行为的原因是什么?

这肯定会起作用,因为每次MvcApplication实例化时,都会ApplicationContext创建一个新的实例。


推荐阅读