IIS7集成模式初始化Spring.NET容器(Request is not available in this context exception in Ap

论坛 期权论坛 脚本     
匿名技术用户   2021-1-7 11:10   45   0

一般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);
}


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP