Application_EndRequest应用程序部署到服务器时不调用

本文关键字:服务器 调用 部署 EndRequest 应用程序 Application | 更新日期: 2023-09-27 18:34:34

在我的Global.asax.cs文件中,我有以下方法:

protected virtual void Application_BeginRequest() {
    HttpContext.Current.Items["message"] = "Hello World";
}
protected virtual void Application_EndRequest() {
    string message = (string)HttpContext.Current.Items["message"];
    if (String.IsNullOrEmpty(message)) {
        HttpContext.Current.Response.Write("<!-- Empty Message! -->");
    }
    else {
        HttpContext.Current.Response.Write("<!-- Message: " + message + " -->");
    }
}

当我在本地运行时,消息输出在结束</html>标记之后。

当我部署到测试服务器时,不会输出消息,甚至不会输出<!-- Empty Message! -->消息。 我甚至可以添加代码以在永远不会引发的 Application_EndRequest 方法中引发异常。

我已经在以前的项目中使用了这种方法,这些项目使用 VS2010 和 MVC 4 构建,主要用于每个请求一个 dbcontext 解决方案,没有问题。

我在调查为什么HttpContext.Current.Items在请求期间丢失值时发现了这一点,同样仅在部署到测试服务器时。(类似于这个未解决的问题(

该应用程序是使用Visual Studio 2013和MVC 5(即新的MVC应用程序并且没有自定义代码(直接"开箱即用"的,因此对web.config的更改很少。 实际上,唯一的更改是解决空白页面问题

<system.webServer>
    <modules>
        <remove name="UrlRoutingModule-4.0" />
        <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
    </modules>
</system.webServer>

有谁知道为什么Application_EndRequest不会在服务器上被调用?

是否需要其他配置设置?

更新201412191534

我终于让Glimpse工作了。 我在Application_StartApplication_BeginRequestApplication_EndRequest中添加了一些TraceInformation消息。 在本地运行时,将显示跟踪消息。 将应用部署到测试服务器,但不显示任何消息。 因此,似乎 global.asax 上的所有方法都没有在服务器上被调用,这可以解释我丢失HttpContext.Current.Items - 它们一开始就没有被设置!

更新201412221010

我现在已经研究了为什么 Global.asax 中的事件没有被调用,并发现了许多类似的问题:

  • Global.asax 中的事件未触发
  • Global.asax 事件在 IIS 6 中未触发
  • Global.asax
  • 未发布,事件未在 Global.asax 中触发
  • 为什么 Global.asax 事件没有在我的 ASP .NET 网站中触发?

我尝试过以下建议: - 确保 Global.asax 继承自正确的类(确实如此(;
- 设置代码断点(永远不会达到,因为事件未触发(

然后我发现了这个 - Global.asax 在 IIS7 中没有触发 .aspx 页,它建议使用我没有的<modules runAllManagedModulesForAllRequests="true">,因为我使用的是将以下内容添加到modules部分

的方法
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />

因为每个人都建议不要使用runAllManagedModulesForAllRequests="true". 请参阅这篇文章 不要在使 MVC 路由工作时使用 runAllManagedModulesForAllRequests="true">

然而,在一次卑鄙的尝试中,我使用了这个邪恶的属性,你猜怎么着? 事件又开始被点燃了!

我们还没有应用该修补程序,我还没有找到如何将模块添加到modules部分,即我的应用程序的正确语法。

Application_EndRequest应用程序部署到服务器时不调用

global.asax 文件表示的 HttpApplication 实例是仅表示第一个 HttpApplication 对象的单个实例。不保证此 HttpApplication 实例将用于任何其他请求。

您需要覆盖 global.asax 中的 Init(( 方法,并在该方法中挂接您想要的任何事件:

public override void Init() {
    base.Init();
    EndRequest += MyEventHandler;
}

有关 HttpApplication 对象的详细信息,请参阅此 MSDN 文章。

这个答案在这里找到。