gpt4 book ai didi

asp.net - "Require SSL"如何影响 ASP.NET MVC 应用程序生命周期?

转载 作者:太空宇宙 更新时间:2023-11-03 12:40:14 25 4
gpt4 key购买 nike

我有一个应用程序可以利用 BeginRequestEndRequest 来设置和取消 NHibernate session ,如下所示:

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

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

Container.Release(session);
};

这在 IIS 中部署时工作正常,直到我选中“需要 SSL”框。执行此操作后,我会在 session.Dispose() 处收到一个 NullReferenceException

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

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

最佳答案

这激起了我的好奇心,所以我深入研究了一下;抱歉死灵法术。

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

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

所以你的代码崩溃了,因为 BeginRequest 事件从未被触发,而 EndRequest 委托(delegate)试图 Dispose() 一些从未触发过的东西已创建。

对我来说有趣的是弄清楚 为什么 IIS 的行为如此。我怀疑原因是 IIS 仍然需要记录无效的连接尝试,以及发送内容和 header ,即使请求的资源需要 SSL。毕竟,某些东西必须生成那个友好的“禁止”页面。我不知道的是为什么在他们根本不打扰调用 BeginRequest 时调用了 EndRequest;我猜有一些 IIS/ASP 清理代码依赖于它。

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

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

关于asp.net - "Require SSL"如何影响 ASP.NET MVC 应用程序生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3055704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com