我有一个ASP.NET MVC(beta)应用程序,我正在研究,并且我无法弄清楚我是否做错了什么,或者我Application_Start
在Global.asax.cs中的方法实际上是不是在我尝试时触发调试应用程序.
我在我的Application_Start
方法中的一行上放了一个断点,并且我希望当我尝试调试应用程序时断点应该被击中...但它永远不会.不是在我重置IIS之后,不是在我重新启动之后,不是.我错过了什么吗?为什么这种方法永远不会被调用?
注意:使用内置的"Visual Studio开发服务器"或IIS Express(例如,因为您正在针对IIS进行开发并具有应用程序正常运行所需的特定设置)的一个很好的替代方法是简单地保持在IIS中运行(I使用自定义Web服务器+主机文件条目+ IIS绑定到同一个域)
等待调试会话启动好了
然后只需对根web.config进行空格编辑并保存文件
刷新页面(Ctrl + F5)
您的断点应该很好地击中,并且您可以继续在自然的IIS栖息地中进行调试.好极了!
如果这是在IIS中,则应用程序可以在调试器附加之前启动.如果是这样,我不确定你是否可以在足够长的时间内完成睡眠.
在Visual Studio中,您可以将调试器附加到进程.您可以通过单击Debug >> Attach to process来执行此操作.连接到浏览器,然后点击您的应用程序.为了安全起见,请重新启动IIS并点击该站点.我并不是100%确信这会解决问题,但它会比在App_Start中启动线程睡眠好得多.
另一个选项是在内置Web服务器中临时托管,直到您完成调试应用程序启动.
以下情况有帮助(无论您使用的是IIS,Cassini还是其他):
在Application_Start中设置断点
开始调试(断点很可能没有命中) - >浏览器中显示一个页面
更改web.config(例如输入一个空行)并保存
在浏览器中重新加载页面 - >断点被击中!
为什么这样做?更改web.config时,Web服务器(IIS,Cassini等)执行回收,但在这种情况下(无论出于何种原因),进程保持不变,因此您可以使用调试器(Visual Studio)保持连接).
我在application_start中遇到断点问题,IIS也是托管应用程序.一个很好的解决方法是使用Debugger.Break(); 在代码而不是VS断点
我有同样的问题.我在我的解决方案中做了很多重命名.之后,我有两个不工作的网络应用程序和几个其他网络应用程序都没事.我得到错误,我有错误的路线.当我尝试在Application_Start
方法中设置断点,然后重新启动IIS时,VS没有中断执行.随着可行的Web应用程序中断正在运行.然后我回忆起"清理解决方案"和"重建"不会删除重命名后留下的程序集.这就是解决方案!我已经手动清理bin
了我的bug-web-applications的目录,然后看到Global.asax
Inherits=""
属性中的新错误被引用了旧的dll.我已经改变它,新的和休息开始工作.假设在重命名期间Global.asax没有更新,并且IIS使用旧的程序集(具有错误的路由)来启动应用程序.
在另一个供应商建造的项目中,我们遇到了同样的问题。问题在于,尽管以前的供应商在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文件中,并逐渐将更改合并回去。
尝试将应用程序池的托管管道模式切换为"经典"而不是"集成".这解决了我的问题.现在调查原因......
(这个答案的道具属于弗洛雷斯(见他对自己答案的评论),我只想提供一个单独的答案来吸引更多关注它)