【问题标题】:How does "Require SSL" affect ASP.NET MVC application lifecycle?“需要 SSL”如何影响 ASP.NET MVC 应用程序生命周期?
【发布时间】:2011-03-04 14:21:38
【问题描述】:

我有一个应用程序可以利用 BeginRequestEndRequest 来设置和拆除 NHibernate 会话,如下所示:

BeginRequest += delegate
{
    CurrentSessionContext.Bind(SessionFactory.OpenSession());
};

EndRequest += delegate
{
    var session = CurrentSessionContext.Unbind(SessionFactory);
    session.Dispose();

    Container.Release(session);
};

这在 IIS 中部署时可以正常工作,直到我选中“需要 SSL”框。完成此操作后,我会在session.Dispose() 收到NullReferenceException

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

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

【问题讨论】:

  • 您是否最初使用 Http 浏览应用程序,然后它会告诉您使用 Https?或者...您是使用 Https 直接浏览应用程序吗?
  • 我正在使用 Http 连接。我期待 IIS 立即响应重定向而不调用我的任何代码。

标签: asp.net asp.net-mvc iis-7 ssl requiressl


【解决方案1】:

这个引起了我的好奇心,所以我深入研究了它;对不起,死灵术。

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

事实证明,当设置了“需要 SSL”并且您在没有 SSL 的情况下访问时,大部分事件都被完全跳过。第一个触发的事件是LogRequest,然后是PostLogRequestEndRequestPreSendRequestContentPreSendRequestHeaders(按此顺序)。不会触发其他事件。

因此,您的代码崩溃了,因为从未触发过 BeginRequest 事件,并且 EndRequest 委托试图 Dispose() 从未创建过的东西。

我感兴趣的是搞清楚为什么 IIS 的行为是这样的。我怀疑原因是 IIS 仍然需要记录无效的连接尝试,以及发送内容和标头,即使请求的资源需要 SSL。毕竟,有些东西必须生成那个友好的“禁止”页面。我不知道的是,为什么在他们不打扰BeginRequest 的情况下会调用EndRequest;我猜有一些 IIS/ASP 清理代码依赖于它。

此行为取决于应用程序池是在“集成”模式还是“经典”模式下运行。在“经典”模式下,ASP.NET 事件都在 IIS PreRequestHandlerExecutePostRequestHandlerExecute 事件“之间”触发。你没有说你在运行哪个,但它必须是集成的;否则你会看到你所期望的行为,即你的任何代码都不会执行。

有趣的是,如果您在经典模式下尝试订阅LogRequestPostLogRequestMapRequestHandler 事件,则会收到运行时异常;这些只有在集成管道的上下文中才“有意义”。

【讨论】:

  • 很好的答案!感谢您抽出宝贵时间对此进行研究。
【解决方案2】:

这里有一些可以帮助你的东西

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 中所做的事情。

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多