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

Rag*_*esh 12 asp.net asp.net-mvc ssl iis-7 requiressl

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

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

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

    Container.Release(session);
};
Run Code Online (Sandbox Code Playgroud)

这在IIS中部署时工作正常,直到我检查"需要SSL"框.一旦我这样做,我得到NullReferenceExceptionsession.Dispose().

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

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

Dav*_*ope 5

这一个引起了我的好奇心,所以我稍稍挖了一下; 对不起来了.

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

事实证明,当设置"要求SSL"并且您在没有SSL的情况下访问时,大多数事件都被完全跳过.使用的第一个事件LogRequest,其次是PostLogRequest,EndRequest,PreSendRequestContent,和PreSendRequestHeaders(按顺序).没有其他事件被解雇.

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

对我来说有趣的是弄清楚为什么 IIS会像这样.我怀疑原因是IIS仍然需要记录无效的连接尝试,以及发送内容和标头,即使请求的资源需要SSL.毕竟,有些东西必须产生友好的"禁止"页面.我不知道的是EndRequest,当他们不打电话时,为什么会被召唤BeginRequest; 我猜有一些依赖它的IIS/ASP清理代码.

此行为取决于应用程序池是以"集成"还是"经典"模式运行.在"经典"模式下,ASP.NET事件全部触发"介于"IIS PreRequestHandlerExecutePostRequestHandlerExecute事件之间.你没有说你在运行哪个,但它必须是集成的; 否则你已经看到了你期望的行为,即你的代码根本就没有执行过.

有趣的是,如果你尝试订阅LogRequest,PostLogRequestMapRequestHandler当在经典模式下,你会得到一个运行时异常事件; 这些只是在综合管道的背景下"有意义".