【问题标题】:Application_start not workingApplication_start 不工作
【发布时间】:2014-09-22 11:32:28
【问题描述】:

我在global.asax 文件中的application_start() 方法中编写了一些代码。当我在IIS 服务器上部署我的应用程序时,它不会被调用。当我在 .NET 框架中运行代码时,它是可以访问的。

我多次尝试重新启动应用程序,但仍然无法正常工作。

我也尝试了以下链接中的建议。

Application_Start not firing?

【问题讨论】:

  • 您使用的是哪种项目类型?
  • 你能在本地调试吗?检查远程 IIS 的 .NET 版本
  • 尝试将方法重命名为 Application_Start() 并归档 Global.asax(案例)。你是如何检查 Application_Start 没有被调用的?
  • @FelipeKM 是可能的。
  • @mt_serg 我在 Application_Start() 中编写了数据库代码,它将在数据库中插入记录。但它不起作用。

标签: c# asp.net .net


【解决方案1】:

在尝试调试 Appplication_Start 之前,您需要了解几件事。有——

一:代码何时执行以及为什么通过附加到它几乎无法调试。

应用程序启动方法在应用程序池启动并且您的网站首次启动时执行。如果您将新的交付物部署到 IIS,则 IIS 可能会自行重新启动它,但不能保证它会重新启动。因此,部署新代码并不能保证它将重新启动池并执行应用程序启动。您应该重新启动应用程序池以保证应用程序启动的执行。

在调试 IIS 应用程序时,Visual Studio 会将自己附加到一个名为 w3wp.exe 或类似名称的进程(我忘记了实际的可执行文件名称),这是一个工作进程,只有在您的应用程序池启动之后才可用,并且记住之后您的网站已启动。因此,换句话说,如果您在服务列表中看到它,那么应用程序启动已经执行并且附加到它不会给您调试它的机会。这是一场与时间的拉锯战。

所以,换句话说,调试应用程序启动是不可能的,除非你非常非常快。

二、解决方案 1 - 使用 Dev Server

使用 Asp.net 开发服务器或 IIS express 在 Visual Studio 中启动您的应用程序,然后您就可以进行调试了。但是如果你真的想在 IIS 上调试,那么请查看下一节

二、解决方案2——使用IIS

有一个名为System.DiagnosticsDebugger的库,它有一种在代码中调用调试器的好方法。你可以在这里阅读 - http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.break(v=vs.110).aspx

从这里开始修改你的应用程序 -

public void Application_Start(){
    ....... //other codes
    Debugger.Break() or Debugger.Launch()
}

当这一行执行时,IIS 将停止执行,并会显示一个调试器选择器窗口(类似于附件),让您的解决方案在 vs 中打开并从列表中选择 vs,将能够像往常一样调试... :)

如果您使用的是 Windows 8 并且调试器无法启动,请阅读本文以启用它 -

http://blogs.msdn.com/b/mapo/archive/2013/11/07/debugger-launch-not-displaying-jit-debugger-selection-popup-on-windows-8-8-1.aspx

三:非常重要的事情

我注意到您说,您正在 Application_Start 中添加 db 条目。您应该记住,Application_Start 没有HttpContextViewContext,因此您的数据库访问代码可能由于许多其他原因而失败。

【讨论】:

    【解决方案2】:

    确保Global.asax 文件实际部署到根目录中的目标文件夹。如果该文件不存在,那么您为Application_Start 编写的代码将永远不会被调用。

    还要确保签名正确

    public class Global : System.Web.HttpApplication {
       protected void Application_Start(object sender, EventArgs e) {/*do something here like logging so you know it was called*/}
    }
    

    【讨论】:

      【解决方案3】:

      如果您运行的是 Server 2008R2(或更早版本)和/或 IIS 7.5,您可能需要查看应用程序初始化模块。可以在这里下载:

      www.iis.net/downloads/microsoft/application-initialization

      对于 8.0 之前的 IIS 版本,在第一个 Web 请求到达之前不会调用应用程序启动。我正在阅读您的问题,因为您希望在第一个 Web 请求之前启动您的应用程序,是吗?

      这是配置此模块的精彩指南(如果适用于您): https://blogs.msdn.microsoft.com/benjaminperkins/2014/01/07/configure-the-iis-application-initialization-module/

      关键要点是您需要将应用程序池设置为“AlwaysRunning”而不是“OnDemand”。您还需要为您的网站设置一个 preloadEnabled 标志。完成这两项后,启动 iisreset,您应该会看到应用程序启动的结果(查看数据库,因为它正在那里写入)。

      其他答案也是相关的,因为这很难调试,而且你会错过所有你习惯的细节,例如应用程序启动中的 httpcontext。

      如果您运行的是 IIS 8.0 - 您仍应阅读上述链接来配置预加载。

      【讨论】:

      • 这么多年过去了,我试图让 MVC 5 应用程序在 Server 2016 上启动,该博客给出了答案。谢谢!
      【解决方案4】:

      这确实对我有用:

      • 菜单 -> 构建 -> 清洁解决方案
      • 菜单 -> 构建 -> 重建解决方案

      然后,Application_Start() 只是第一次被触发。

      【讨论】:

        【解决方案5】:

        就我而言,在生产环境中 App_global.asax.compiled 丢失并且 global.asax 的所有内容都没有被触发。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-19
          • 1970-01-01
          • 2013-01-31
          • 2012-10-22
          • 2011-10-28
          • 2018-10-12
          • 1970-01-01
          • 2018-03-31
          相关资源
          最近更新 更多