代码之家  ›  专栏  ›  技术社区  ›  Ragesh

“需要SSL”如何影响ASP.NET MVC应用程序生命周期?

  •  12
  • Ragesh  · 技术社区  · 16 年前

    我有一个应用程序 BeginRequest EndRequest 要设置和取消这样的nhibernate会话:

    BeginRequest += delegate
    {
        CurrentSessionContext.Bind(SessionFactory.OpenSession());
    };
    
    EndRequest += delegate
    {
        var session = CurrentSessionContext.Unbind(SessionFactory);
        session.Dispose();
    
        Container.Release(session);
    };
    

    当部署在IIS中时,这很好地工作,直到我选中“需要SSL”框。一旦我这样做,我会得到一个 NullReferenceException session.Dispose() .

    我还没有对此进行调试,是的,修复是微不足道的,但我只是好奇“需要SSL”如何影响请求的生命周期。在这些情况下,是否没有在服务器上设置会话?

    编辑 :为了澄清,我指的是应用程序的IIS配置中的“需要SSL”选项,而不是 RequireHttps 控制器的属性。

    2 回复  |  直到 15 年前
        1
  •  5
  •   David Pope    15 年前

    这一个激起了我的好奇心,所以我稍微深入研究了一下;为死灵仪式感到抱歉。

    我创建了一个简单的项目,它为应用程序对象上的每个生命周期事件连接通知,并在每个生命周期事件上设置断点。

    结果表明,当设置了“需要SSL”并且您在没有SSL的情况下访问时,大多数事件都被完全跳过。第一个开火的事件是 LogRequest 紧随其后 PostLogRequest , EndRequest , PreSendRequestContent PreSendRequestHeaders (按顺序)。没有其他事件被激发。

    所以你的代码崩溃是因为 BeginRequest 事件从未被激发,并且 最终请求 代理人试图 Dispose() 从未创造过的东西。

    我感兴趣的是 为什么? IIS的行为是这样的。我怀疑原因是IIS仍然需要记录无效的连接尝试,以及发送内容和头,即使请求的资源需要SSL。毕竟,有些东西必须生成友好的“禁止”页面。我不知道为什么 最终请求 当他们不想打电话的时候 开始请求 ;我猜有一些IIS/ASP清理代码依赖于它。

    此行为取决于应用程序池是在“集成”模式还是“经典”模式下运行。在“经典”模式下,ASP.NET事件在“IIS”之间全部触发 PreRequestHandlerExecute PostRequestHandlerExecute 事件。您没有说您运行的是哪一个,但是它必须被集成;否则您会看到您期望的行为,即您的代码根本不会执行。

    有趣的是,如果您尝试订阅 洛格雷斯特 , 后格洛克任务 MapRequestHandler 事件在经典模式下,您会得到一个运行时异常;在集成管道的上下文中,这些异常只是“有意义的”。

        2
  •  -1
  •   Oakcool    15 年前

    这是一些可以帮助你的东西

    ASP.NET Application Life Cycle Overview for IIS 5.0 and 6.0

    ASP.NET Application Life Cycle Overview for IIS 7.0

    您可能希望在global.asax中做您正在做的事情。

    推荐文章