Application_Start无法启动?


143

我有一个正在工作的ASP.NET MVC(测试版)应用程序,无法确定我做错了什么,或者Application_Start在尝试时Global.asax.cs中的方法实际上没有触发调试应用程序。

我在Application_Start方法中的一行上放置了一个断点,并期望当我尝试调试应用程序时,该断点会被击中……但它从未成功。不是在重设IIS之后,还是在重新启动之后,再也没有。我想念什么吗?为什么从未调用此方法?


您的global.asax页是否继承自方法所在的全局类?

我已经跳回global.asax文件丢失的情况。因此,也值得检查:-)
itsho 2015年

Answers:


85

如果在IIS中,则可以在附加调试器之前启动该应用程序。如果是这样,我不确定您是否可以将线程睡眠足够长的时间来建立连接。

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

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


21
展开-(在VS2010中,使用MVC 3项目类型)右键单击Web项目>属性> Web(选项卡),并确保选中“使用Visual Studio Development Server”单选按钮。然后您的Application_Start断点应该被击中。
MemeDeveloper 2011年

谢谢@MemoDeveloper!太棒了!!
Praveen Prajapati

2
Ahhhhhh mannnnnnn,我失去了几个小时。再次!!感谢您的回答。:)
塞缪尔2015年

如果您在Visual Studio中的Application.Start()下的Global.asax.cs中设置了一个断点,并且该断点不会触发,请检查您的构建类型。如果您作为发行版运行,则可能不会触发此断点。切换到调试,它应该停止。
保罗

171

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

  1. 等待调试会话启动
  2. 然后只需对根web.config进行空白编辑并保存文件
  3. 刷新页面(Ctrl + F5)

您的断点应该被很好地击中,并且您可以继续在自然的IIS环境中进行调试。太好了!


这是出色的AppDomain回收连接。谢谢 !!
Sanjay10 2015年

没有更多的Visual Studio开发服务器。stackoverflow.com/questions/19676527/...
mac10688

1
@ mac10688是正确的,但是仍然存在“ IIS Express”,它通常仍然不是生产环境。相应地更新了答案,谢谢。
MemeDeveloper

确定的答案。我将设备指向我的IIS,该设备在使用IIS Express版本时不允许通讯!这很有魅力。
马特·斯凯尔顿

54

在任何情况下(无论您使用的是IIS,Cassini还是其他类型),以下内容都可以帮助您:

  1. 在Application_Start中设置断点
  2. 开始调试(断点很可能没有命中)->浏览器中显示一个页面
  3. 更改web.config(例如输入空白行)并保存
  4. 在浏览器中重新加载页面->命中断点!

为什么这样做?更改web.config时,Web服务器(IIS,Cassini等)会进行回收,但是在这种情况下(无论出于何种原因),该过程都保持不变,因此您需要使用调试器(Visual Studio)进行附加)。


3
克隆,两年后stackoverflow.com/a/7655582/11635-考虑删除并在评论中添加任何其他信息
Ruben Bartelink,2016年

实际上@RubenBartelink,我认为这个答案比另一个答案更清晰,因为其措辞和额外的解释。
Heriberto Lugo

1
@HeribertoLugo我很酷-很难完全不同意50次投票(不过,如果有人有时间和背景,我会很高兴编辑另一个答案以缩小差距;我已经有一段时间了我在IIS上使用了调试器!)
Ruben Bartelink,

我同意编辑另一个并删除它是更好的方法。.我先看到另一个,然后稍稍移开,所以它没有用..当我在花了半个小时之后看到了另一个,然后它变了更有意义..那半个小时我不需要失去..
Heriberto Lugo

22

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


2
我相信不会因为在集成管道模式下运行应用程序池而达到断点。你在用那个吗?
Flores 2010年

9

我有同样的问题。我在解决方案中做了很多重命名。之后,我得到了两个无法正常工作的Web应用程序,还有几个其他的Web应用程序都可以。我有错误的路线。当我尝试在Application_Start方法中设置断点,然后重新启动IIS时,VS并未中断执行。有了可行的Web应用程序,中断才起作用。然后我想起了“干净的解决方案”和“重建”并没有删除重命名后剩下的程序集。那就是解决方案!我已经手动清理bin了我的越野车网络应用程序的目录,然后看到Global.asax Inherits=""属性中的新错误被引用为旧dll。我在新的地方进行了更改,并且中断开始起作用。假设在重命名Global.asax时未更新,


哇,很难找到!那是小费!
Landon Poch 2013年

@Dao真的,太棒了,谢谢;)我为此浪费了几个小时,我应该在之前找到你的答案:)
Pankaj Parkar 16/12/29

7

在另一个供应商建造的项目中,我们遇到了同样的问题。问题在于,尽管以前的供应商在Global.asax.cs中编写了许多命令,这些命令可能使您相信它正在使用中,但实际上却被完全忽略了。Global.asax并非继承自该文件,如果存在.cs文件,则很容易永远看不到该文件-您必须右键单击Global.asax并单击“查看标记”才能实际看到它。

Global.asax:

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

需要更改为:

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

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

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


就是这样 我在App start中添加了一个例外(根据Prisoner ZERO的回答),它根本没有触发,因此与调试器无关。更新Global.asax标记可以解决此问题。
帕特里克·博尔科维奇

5

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

(此答案的道具属于Flores(请参阅他对自己答案的评论),我只是想将其作为单独的答案提供,以引起更多关注)


是的,它有效。但是,如果您假设您的应用程序应该在集成应用程序池下工作,那么它也应该在集成池下进行调试。
卡雷尔·卡拉

当我从经典切换到集成时,我的应用程序在“ F5”之后也不会达到断点。你有没有发现原因?我没有使用Integrated的任何要求,但是当这些事情由于没有明确的原因而无法工作时,这令人沮丧。
CodexArcanum 2012年

5

确保您的global.asax不在子目录下。必须将其放在项目的根目录下。


非常感谢!!!你让我免于发疯!这正是导致我的问题的原因。
Yann Duran 2013年

1
我的问题是,我刚刚创建了一个名为的类,Global.asax.cs并希望它能正常工作。您需要使用Add-> New Item-> 创建它,Global Application Class以便使用相应的Global.asaxWeb表单配置文件创建它。
Levi Fuller

4

我们有一个类似的问题,其中global.asax.cs被忽略了。

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


3

曾经有个问题,部署脚本实际上没有将Global.asax和Global.asax.cs复制到IIS文件夹中。因此,它在开发服务器上进行调试时有效,而在IIS下则无法工作。


我有同样的问题。将Global.asax上传到服务器后,问题解决了。
回教徒哈迪

3

迟到...

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

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

2

当您说“调试”时,是指实际上是从Visual Studio的内置Web服务器启动应用程序以进行调试,还是要附加到IIS中的进程?如果是前者,则应单击Application_Start,但如果是后者,则可能很难尽早进行此过程以赶上它。


正确,我的意思是从VS启动应用程序。我将其托管在IIS中,因此VS附加到了该过程。您是说在VS可以附加到流程之前触发该事件吗?
Bob Yexley,2009年

2

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

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

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

2

我根据Visual Studio的“构建时的代码分析”进行了一些更改。代码分析在Global.asax中为Application_Start()建议“ CA1822将成员标记为静态”。我这样做了,最终遇到了这个问题。

我建议禁止显示此代码分析消息,并且不要更改用于引导应用程序的平台自动创建的方法/类的签名。由于某种原因,Application_Start方法的签名可能是非静态的。

我恢复到此方法签名,并且Application_Start()再次触发:

    protected void Application_Start()
    { ... }

2

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


这就是为我做的。谢谢。
reekeecast '19

2

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


1

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


是的,我正在向应用程序发出请求。
Bob Yexley,2009年

1

我在.net 4 Web表单vs2010项目中遇到了这个问题,并尝试了此页面上提到的所有内容。最终删除并添加global.asax确实为我解决了这个问题。


1

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


1

您检查项目设置了吗?我遇到了这个问题,我将“开始URL”转到了与服务器特定端口不同的端口。我花了很长时间才弄清楚...


1

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


它正在执行。您根本无法调试它,因为您尚未附加到IIS进程,或者尚未执行该进程。
uygar.raf,2015年

1

我试图单步执行从Application开始调用的RegisterRoutes()中的代码,而没有遇到断点。我确定没有调用Application_Start。我必须进行更改以对App_start / RouteConfig.cs进行表面更改,然后保存它,然后再调用Application_Start。我猜这些文件将缓存在某个地方,除非进行更改,否则它们不会被调用。



0

如果您正在使用System.Diagnostics.Debugger.Break(); 解决方法(我认为临时使用就可以了),并且在Windows 8计算机上“无法正常工作”。原因是Visual Studio的“及时调试”中的错误。

该修补程序如下,它是为“ Visual Studio即时调试器”修复密钥的。

打开regedit并转到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


0

就我而言,通过系统任务栏杀死内置的ASP.NET Development Server实例可以解决此问题。


0

奇怪而疯狂的东西...但是在服务器计算机上调试和另一个用户使IIS Express在其会话上运行。我必须注销该用户才能杀死他正在运行的IIS Express进程。看来已经解决了问题!

更新资料

在花费了超过1个小时的时间来追究导致问题的原因之后……这就是问题所在:我s在的<appSettings>部分中设法设法键入了一个内容Web.config。Visual Studio中试图警告我在Error List同一个窗口警告。我承认我很少检查警告...应该从现在开始检查它。:D一旦我删除了违规s的断点,就将其击中Application_Start

在此处输入图片说明


0

尝试初始化log4net时遇到此问题。我决定为Global.asax制作一个静态构造函数

static Global(){
//Do your initialization here statically
}

0

当您尝试将Global.asax文件重新定位到另一个解决方案目录时,主要会出现问题。再次将Global.asax文件重新定位到默认位置。它将按预期工作。


如果网站上的所有内容(包括Global.asax.aspx)都已预编译怎么办?我已经在bin目录中预编译了文件。未触发Application_Start。
Vin Shahrdar,2017年

0

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

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.