繁体   English   中英

Application_Start 没有触发?

[英]Application_Start not firing?

我有一个正在开发的 ASP.NET MVC(测试版)应用程序,但我无法弄清楚我是否做错了什么,或者我在 Global.asax.cs 中的Application_Start方法实际上没有在我启动时触发尝试调试应用程序。

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

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

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

您的断点应该很好地命中,并且您可以继续在您的自然 IIS 栖息地中进行调试。 伟大的 !

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

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

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

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

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

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

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

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

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

全球.asax:

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

需要改为:

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

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

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

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

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

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

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

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

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

迟到的入场...

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

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

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

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

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

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

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

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

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

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

    protected void Application_Start()
    { ... }

当您说“调试”时,您是指实际从 Visual Studio 的内置 Web 服务器启动应用程序进行调试,还是指附加到 IIS 中的进程? 如果是前者,您应该点击 Application_Start,但如果是后者,则可能很难及早进入流程以捕捉它。

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

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

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

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

我试图单步执行从应用程序开始调用的 RegisterRoutes() 中的代码,但没有达到我的断点。 我确定 Application_Start 没有被调用。 我必须进行更改以对 App_start/RouteConfig.cs 进行表面更改并在 Application_Start 被调用之前保存它。 我猜这些文件被缓存在某处,除非进行更改,否则不会被调用。

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

在此处输入图片说明

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

如果您使用 System.Diagnostics.Debugger.Break(); 解决方法(我认为它适合临时使用)并且它在您的 Windows 8 机器上“不起作用”。 原因是 Visual Studio 的“及时调试”中的一个错误。

修复如下是修复“Visual Studio Just-In-Time Debugger”的关键

打开 regedit 并转到 HKEY_CLASSES_ROOT\\AppID{E62A7A31-6025-408E-87F6-81AEB0DC9347} 获取“Ap​​pIDFlags”注册表值,将标志设置为 0x8

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

就我而言,通过系统托盘终止内置 ASP.NET 开发服务器实例解决了该问题。

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

更新

在花了 1 个多小时追查导致问题的原因之后......这就是交易:我在某种程度上设法在Web.config<appSettings>部分中输入了一个s Visual Studio 试图在Error List窗口中警告我警告 我承认我很少检查警告......应该从现在开始检查它。 :D 一旦我删除了有问题的s ,断点就会在Application_Start被击中。

在此处输入图片说明

我在尝试初始化 log4net 时遇到了这个问题。 我决定为 Global.asax 创建一个静态构造函数

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

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

上面描述的解决方案都不适合我。 但是重新安装包

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

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

暂无
暂无

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

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