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

时间:2018-05-08 02:38:55

标签: c# asp.net global-asax

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

this➡(当然要删除InitializeContext();:P)

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

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

1 个答案:

答案 0 :(得分:3)

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

如果不存在任何状态,您可以将其设为static,或者根据您收到的每个请求再次初始化它。

  

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

     

没有问题!是什么原因    对于这种行为?

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