一般Spring容器是在執行第一個請求的時候觸發的,但我碰到個需求,必須在應用程式啟動的時候就要能夠初始化Spring上下文。換句話說,我在Application_Start時就要能夠執行
ContextRegistry.GetContext()
我使用了SignalR架構,為了和Spring一起協同工作,我需要使SignalR內建的IoC容器與Spring.NET容器協同工作(SignalR容器同時能夠擷取Spring容器中的對象,這不是本文重點)。
說一下本文出處(http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart/)
解決的思路是將初始化工作延遲到第一次請求再執行(包括MVC註冊路由等)
在global.asax中添加如下私人類
private class FirstRequestInitialization { private static bool s_InitializedAlready = false; private static Object s_lock = new Object(); // Initialize only on the first request public static void Initialize(HttpContext context) { if (s_InitializedAlready) { return; } lock (s_lock) { if (s_InitializedAlready) { return; }//這裡的內容就是原本要放在Application_Start中做的事情 DependencyResolver.SetResolver(new SpringMvcDependencyResolver(ContextRegistry.GetContext())); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); s_InitializedAlready = true; } } }
隨後在覆蓋BeginRequest方法
protected void Application_BeginRequest(object sender, EventArgs e){ FirstRequestInitialization.Initialize(Context);}