繁体   English   中英

Application_start 不起作用

[英]Application_start not working

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

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

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

Application_Start 没有触发?

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

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

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

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

因此,换句话说,除非您非常非常快,否则调试应用程序启动是不可能的。

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

在 Visual Studio 中使用 Asp.net 开发服务器或 IIS express 启动您的应用程序,然后您就可以进行调试了。 但是如果你真的想在 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 ,因此您的数据库访问代码可能由于许多其他原因而失败。

确保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*/}
}

如果您运行的是 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 - 您仍然应该阅读上面的链接来配置预加载。

这对我有用:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM