Asp.Net MVC 应用程序 属性 在调用 Application_Start() 后始终为 null

Asp.Net MVC application Property is always null after Application_Start() is called

我的 MVC 应用程序有以下 global.asax。每次请求开始时,我都会向 Application_BeginRequest() 中的每个请求添加 ApplicationContext(它有一些对象,例如 Tokenfactory 来处理身份验证等)。尽管 ApplicationContextApplication_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();

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

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

如果它不保持任何状态,您可以使其 static,或者根据您收到的每个请求重新初始化它。

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

It works without problems! What is the reason for this behavior?

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