Rag*_*esh 12 asp.net asp.net-mvc ssl iis-7 requiressl
我有一个应用程序可以点击BeginRequest并EndRequest设置和拆除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"框.一旦我这样做,我得到NullReferenceException的session.Dispose().
我还没有对此进行调试,是的,修复是微不足道的,但我只是对"需要SSL"如何影响请求的生命周期感到好奇.在这些情况下,服务器上是否未设置会话?
编辑:只是为了澄清,我指的是应用程序的IIS配置中的"需要SSL"选项,而不是RequireHttps控制器的属性.
这一个引起了我的好奇心,所以我稍稍挖了一下; 对不起来了.
我创建了一个简单的项目,它为应用程序对象上的每个生命周期事件连接通知,并在每个事件上设置断点.
事实证明,当设置"要求SSL"并且您在没有SSL的情况下访问时,大多数事件都被完全跳过.使用的第一个事件LogRequest,其次是PostLogRequest,EndRequest,PreSendRequestContent,和PreSendRequestHeaders(按顺序).没有其他事件被解雇.
因此,您的代码崩溃了,因为BeginRequest事件从未被触发,并且EndRequest委托尝试Dispose()了从未创建过的东西.
对我来说有趣的是弄清楚为什么 IIS会像这样.我怀疑原因是IIS仍然需要记录无效的连接尝试,以及发送内容和标头,即使请求的资源需要SSL.毕竟,有些东西必须产生友好的"禁止"页面.我不知道的是EndRequest,当他们不打电话时,为什么会被召唤BeginRequest; 我猜有一些依赖它的IIS/ASP清理代码.
此行为取决于应用程序池是以"集成"还是"经典"模式运行.在"经典"模式下,ASP.NET事件全部触发"介于"IIS PreRequestHandlerExecute和PostRequestHandlerExecute事件之间.你没有说你在运行哪个,但它必须是集成的; 否则你已经看到了你期望的行为,即你的代码根本就没有执行过.
有趣的是,如果你尝试订阅LogRequest,PostLogRequest或MapRequestHandler当在经典模式下,你会得到一个运行时异常事件; 这些只是在综合管道的背景下"有意义".
| 归档时间: |
|
| 查看次数: |
961 次 |
| 最近记录: |