Application_Start没有开火?

时间:2009-03-13 01:22:07

标签: c# asp.net-mvc

我正在使用一个ASP.NET MVC(beta)应用程序,并且无法弄清楚我是否做错了,或者我在Global.asax.cs中使用了Application_Start方法实际上,当我尝试调试应用程序时,它并没有触发。

我在Application_Start方法的一行上放了一个断点,并且我希望当我尝试调试应用程序时断点应该被击中...但它永远不会。不是在我重置IIS之后,而不是在我重新启动后,不是。我错过了什么吗?为什么这个方法永远不会被调用?

28 个答案:

答案 0 :(得分:164)

注意:使用内置的“Visual Studio开发服务器”或 IIS Express 的一个很好的简单替代方法(例如,因为您针对IIS进行开发并具有特定功能您需要正确运行应用程序的设置只是在IIS中保持运行(我使用自定义Web服务器+主机文件条目+ IIS绑定到同一个域)

  1. 等待调试会话启动确定
  2. 然后只需对根web.config进行空格编辑并保存 文件
  3. 刷新页面(Ctrl + F5)
  4. 您的断点应该很好,并且您可以继续在自然IIS栖息地中进行调试。好极了!

答案 1 :(得分:81)

如果这是在IIS中,则应用程序可以在调试器附加之前启动。如果是这样,我不确定你是否可以在足够长的时间内完成睡眠。

在Visual Studio中,您可以将调试程序附加到进程。您可以通过单击Debug>>来完成此操作。附加到流程。连接到浏览器,然后点击您的应用程序。为了安全起见,请重新启动IIS并点击该站点。我不是100%确信这会解决问题,但它会比在App_Start中启动线程睡眠好得多。

另一个选项是在内置Web服务器中临时托管,直到您完成调试应用程序启动。

答案 2 :(得分:48)

以下情况有帮助(无论您使用的是IIS,Cassini还是其他):

  1. 在Application_Start
  2. 中设置断点
  3. 开始调试(断点很可能没有被击中) - >页面显示在浏览器中
  4. 更改web.config(例如输入一个空行)并保存
  5. 在浏览器中重新加载页面 - >断点被击中了!
  6. 为什么这样做?更改web.config时,Web服务器(IIS,Cassini等)执行回收,但在这种情况下(无论出于何种原因),进程保持不变,因此您可以使用调试器(Visual Studio)保持连接)。

答案 3 :(得分:22)

我在application_start中遇到断点问题,IIS也是托管应用程序。一个很好的解决方法是使用Debugger.Break();代码而不是VS断点

答案 4 :(得分:9)

我有同样的问题。我在我的解决方案中做了很多重命名。之后,我有两个不工作的网络应用程序和几个其他网络应用程序都没事。我得到错误,我有错误的路线。当我尝试在Application_Start方法中设置断点,然后重新启动IIS时,VS没有中断执行。随着可行的Web应用程序中断正在运行。然后我回忆起“清理解决方案”和“重建”不会删除重命名后留下的程序集。这就是解决方案!我手动清理了我的bug-web-applications的bin目录,然后看到Global.asax Inherits=""属性中的新错误被引用了旧的dll。我已经改变它,新的和休息开始工作。假设在重命名期间Global.asax没有更新,IIS使用旧的程序集(错误的路由)来启动应用程序。

答案 5 :(得分:5)

尝试将应用池的托管管道模式切换为“经典”而不是“集成”。这解决了我的问题。现在调查原因......

(这个答案的道具属于弗洛雷斯(见他对自己答案的评论),我只想提供一个单独的答案来吸引更多关注它)

答案 6 :(得分:5)

在我们在另一家供应商建造它之后接管的项目中遇到了同样的问题。问题在于,尽管前一个供应商在Global.asax.cs中编写了许多命令,这可能会让您相信它正在使用中,但它实际上完全被忽略了。 Global.asax不是从它继承的,如果存在.cs文件,很容易看不到这个文件 - 您必须右键单击Global.asax并单击View Markup才能真正看到它。

的Global.asax:

<%@ Application Language="C#" %>

需要改为:

<%@ Application Codebehind="Global.asax.cs" Inherits="ProjectNamespace.MvcApplication" Language="C#" %>

其中ProjectNamespace是Global.asax.cs类的名称空间(通常是项目名称)。

在我们的例子中,该文件包含一堆内联代码,其中一些是从.cs文件中复制粘贴的,有些则不是。我们只是将内联代码转储到.cs文件中,然后逐步将我们的更改合并。

答案 7 :(得分:4)

确保您的global.asax不在子目录下。它必须放在项目的根级别。

答案 8 :(得分:4)

我们遇到了类似的问题,其中global.asax.cs被忽略了。

事实证明,该网站已从预编译的.NET 2网站升级到.NET 4.0网站。在服务器上,尚未从根文件夹中删除PrecompiledApp.config文件。删除它,并回收IIS应用程序池并触摸web.config以重新启动应用程序后,Global.asax.cs中的代码开始正常工作。

答案 9 :(得分:3)

有一个问题,一旦Global.asax和Global.asax.cs实际上没有被部署脚本复制到IIS文件夹...... 所以它在开发服务器上调试时有效,但不在IIS下。

答案 10 :(得分:2)

当你说“debug”时,你的意思是从Visual Studio的内置web服务器实际启动应用程序进行调试,或者你的意思是附加到IIS中的进程?如果它是前者,你应该点击Application_Start,但如果它是后者,那么很难及早赶上这个过程来抓住它。

答案 11 :(得分:2)

确保Global.asax和Global.asax.cs中的名称空间相同。如果它们不同,它不会抛出任何错误,但也不会遇到断点,因为它根本没有执行application_start。

答案 12 :(得分:2)

当使用静态页面(例如index.html)作为启动页面时,我遇到了这个问题 - 不会调用Application-Start。我发现提供静态页面实际上并没有启动应用程序。请求.aspx页面。

答案 13 :(得分:2)

迟到......

要测试IIS应用程序是否在调试器有足够的时间连接之前启动,只需将其添加到GLOBAL.ASAX Application_Start的顶部或底部。

throw new ApplicationException("Yup, it fired");

答案 14 :(得分:2)

我根据&#34; Build Analysis&#34;进行了一些更改。来自Visual Studio。代码分析建议&#34; CA1822将成员标记为静态&#34;对于Global.asax中的Application_Start()。我这样做了,结果出现了这个问题。

我建议禁止此代码分析消息,而不是更改用于引导应用程序的平台自动创建的方法/类的签名。 Application_Start方法的签名可能是非静态的。

我恢复了这个方法签名,Application_Start()又重新开始了:

    protected void Application_Start()
    { ... }

答案 15 :(得分:2)

关闭Visual Studio并删除Web项目中的binobj文件夹(或解决方案中的所有项目)。

以下是从所有项目中删除这些文件夹的命令:

rm *\bin -r
rm *\obj -r

答案 16 :(得分:1)

我遇到同样的问题,无法捕获Application_Start。 原因是它没有触发标记文件中的错配。 标记文件Global.asax继承了另一个类......

答案 17 :(得分:1)

您是否检查了项目设置? 我遇到了这个问题,我将起始URL转到与我的服务器特定端口不同的端口。 我花了太长时间才弄明白......

答案 18 :(得分:1)

在尝试了许多其他适用于我的情况并且没有任何运气的答案之后,我进入了Web项目的属性(使用RIA Services的Silverlight应用程序的服务器端项目),单击“Web”选项卡,将所选服务器从“本地IIS”更改为“IIS Express”。 (注意我正在使用VS2013。)这解决了这个问题。 Application_Start在“IIS Express”下执行,但不在“Local IIS”下执行。有意思......

答案 19 :(得分:1)

我试图逐步执行从Application start调用的RegisterRoutes()中的代码,而不是命中我的断点。我确定Application_Start没有被调用。我不得不做一个改变,对App_start / RouteConfig.cs进行表面的改动,并在调用Application_Start之前保存它。我猜这些文件会在某处缓存,除非进行了更改,否则不会调用它们。

答案 20 :(得分:1)

我在.net 4网络表单vs2010项目中遇到过这个问题,并尝试了本页提到的所有内容。结束删除和添加global.asax实际上解决了我的问题。

答案 21 :(得分:1)

我认为应用程序启动事件仅在第一次请求时被触发,您是否访问了您的网站(即发出请求)?

答案 22 :(得分:1)

我的同一个问题已通过在项目中添加System.Web.Routing程序集的引用而得到解决

enter image description here

答案 23 :(得分:0)

奇怪和疯狂的东西......但是在服务器机器上调试,另一个用户在会话上运行IIS Express。我不得不注销该用户以杀死他正在运行的IIS Express进程。这似乎解决了这个问题!

<强>更新

花了超过1小时追逐导致问题的原因......这就是交易:我有点设法在s部分内输入 <appSettings> {1}}。 Visual Studio尝试在Web.config窗口中通过警告警告我。我承认我很少检查警告......应该从现在开始检查它。 :D一旦我删除了有问题的 Error List s就会遇到断点。

enter image description here

答案 24 :(得分:0)

尝试初始化log4net时遇到此问题。我决定只为Global.asax

创建一个静态构造函数
static Global(){
//Do your initialization here statically
}

答案 25 :(得分:0)

就我而言,通过系统托盘终止内置的ASP.NET Development Server实例解决了这个问题。

答案 26 :(得分:0)

如果您使用的是System.Diagnostics.Debugger.Break();解决方法(我认为这对于临时使用来说很好)并且它在Windows 8机器上“只是不工作”。原因是Visual Studio的“及时调试”中存在错误。

修复方法如下:修复“Visual Studio即时调试程序”的密钥

打开注册表并转到HKEY_CLASSES_ROOT \ AppID {E62A7A31-6025-408E-87F6-81AEB0DC9347} 对于'AppIDFlags'注册表值,将标志设置为0x8

此处有更多信息: http://connect.microsoft.com/VisualStudio/feedback/details/770786/just-in-time-debugging-operation-attempted-is-not-supported

答案 27 :(得分:0)

以上所述的解决方案均不适合我。 但是重新安装软件包

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

使用nuget gui是一种(不太好)的解决方法