我的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();
没有问题!这种行为的原因是什么?
答案 0 :(得分:3)
Application_Start()
只会触发一次,每次请求都会触发Application_BeginRequest()
。在您的情况下,ApplicationContext
不是static
,而是仅在Application_Start()
中初始化。因此它仅在应用程序启动时可用,对于剩余的请求它将不可用。
如果不存在任何状态,您可以将其设为static
,或者根据您收到的每个请求再次初始化它。
public ApplicationContext ApplicationContext { get; } = new ApplicationContext();
没有问题!是什么原因 对于这种行为?
这肯定会有效,因为每次MvcApplication
实例化时,都会创建ApplicationContext
的新实例。