【问题标题】:Is it possible to debug Global.asax?是否可以调试 Global.asax?
【发布时间】:2010-12-29 23:02:08
【问题描述】:

我无法调试 global.asax 文件!

我在Application_Start() 方法中有一些代码,但是当我在方法中设置断点时,它被忽略了!

这正常吗?

【问题讨论】:

    标签: asp.net global-asax


    【解决方案1】:

    破解Application_Start() 的简单方法是使用System.Diagnostics.Debugger 类。您可以通过在您希望调试器中断的位置插入 System.Diagnostics.Debugger.Break() 来强制中断应用程序。

    void Application_Start(object sender, EventArgs e) 
    {
         System.Diagnostics.Debugger.Break();
    
         // ...
    }
    

    【讨论】:

      【解决方案2】:
      1. 将调试器附加到 IIS 进程。
      2. 打开 global.asax 文件并放入断点。
      3. 在 web.config 文件中添加一个空格并保存文件(这会导致当前 Web 应用程序重置);
      4. 刷新/转到网站上的网页。
      5. 当调试器在您的断点处停止时,您会惊讶不已。 :)

      【讨论】:

      • 这也称为“接触 web.config”,可用于需要在不接触 IIS 的情况下刷新站点的多种场景。不敢相信我没有想到。谢谢。
      • 我希望它是那么简单。但对我来说? “电脑说不”
      • 完美运行。在 Visual Studio 中执行步骤 1 时,我必须勾选“显示所有用户的进程”并附加到名为“w3wp.exe”的 IIS 进程。
      【解决方案3】:

      Application_Start() 每个 AppDomain 调用一次。如果您没有遇到断点,则意味着 AppDomain 已经创建,请执行以下操作:

      • 在您的快速启动栏中,有一个 VS Web 服务器的图标(它显示“Local Host Some Port”)。右键单击并选择“停止”或“关闭”。这应该会杀死 AppDomain。
        • 如果您使用的是 IIS,则需要手动重启您的站点。
        • 或者,修改 Web 配置或 Global.asax 文件通常足以重新启动 AppDomain。
      • 重新开始调试,您现在应该遇到断点了。

      【讨论】:

        【解决方案4】:

        检查您的 Web 应用程序是否处于调试模式(web.config 中的<compilation debug="true">)。

        如果你使用的是VS启动的开发者IIS,重启或者重建应用即可。

        如果您使用的是普通 IIS,您有两种选择:

        1. 对于网站配置为使用开发文件夹(部署 VS Web 项目的位置),您只需重新启动为该网站设置的应用程序池并在第一个请求到达服务器之前开始调试(您可以随时重新启动应用程序调试期间的池)。
        2. 对于在另一个文件夹甚至远程服务器上运行的网站,您必须附加到该进程。为此,您需要在远程计算机或您自己的计算机上安装远程调试器(取决于网络服务器位置)并使用Debug - Attach to process 菜单,输入计算机名称,然后选择要调试的进程。它通常是在托管模式类型下工作的 w3wp.exe。

        【讨论】:

          【解决方案5】:

          也许你应该试试:

          • 在任务栏中停止开发服务器
          • 将配置从发布切换到调试

          【讨论】:

          • 它的评分为负,因为它是错误的。正确地说您需要处于调试状态(否则您没有 pdb 文件)并且您需要在服务器启动时捕获服务器(因为这是运行该代码的时间)但您将无法附加到过程中。您需要一个正在运行的进程来附加调试器,global.asax 代码在该进程开始的前几毫秒内运行,因此实际上不可能(不使用correct answer below)在运行此代码时附加到该进程跨度>
          【解决方案6】:

          是的,这很正常。

          Application_Start() 由 IIS 处理。

          但是所有其他方法,例如Session_Start,以及除Application_Start()之外的所有其他方法都可以正常调试。

          【讨论】:

            【解决方案7】:

            公认的System.Diagnostics.Debugger.Break(); 的另一种选择是

            void Application_Start(object sender, EventArgs e) 
            {
               System.Diagnostics.Debugger.Launch();
               //...
            }
            

            它不应该破坏代码并且应该启动调试器,即使服务是以不同的权限启动的。

            【讨论】:

              【解决方案8】:

              删除global.asax 并添加一个新的。在我的解决方案中,有一个global.asax 和一个global.asax.cs

              所有方法(Session_StartApplication_Start、...)都已在 bot 文件中,但仅考虑了 global.asax 中的方法。因此,cs 中的断点和代码不会做任何事情。
              只有在重新创建文件后,global.asax.cs 才有适当的方法并运行。

              【讨论】:

              • 我按照这里的说明操作:rossnelson.blogspot.ca/2005/11/…。基本上,删除 global.asax 并添加一个全局应用程序类,该类使用代码隐藏文件重新创建 asax,然后我可以进入该文件。我在 IIS 上运行,它工作正常。
              【解决方案9】:

              对我来说,在附加调试器时,我的调试断点已经在 IIS 中执行。所以解决方案是用一点空间改变 global.asax 并保存文件。刷新后,我的断点现在被命中了。

              这里的解决方案: https://wakeupandcode.com/hitting-breakpoints-in-global-asax/

              【讨论】:

              • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
              • 谢谢!这是唯一对我有用的解决方案。在Application 标签内添加一个空格,点击保存,然后刷新浏览器。
              【解决方案10】:

              不要期望通过按 f5 立即调用 Application_Start() 函数。 Application_Start() 仅在第一次向应用程序发出请求时调用。 奇怪但真实。

              【讨论】:

                【解决方案11】:

                如果所有答案都不起作用,请尝试:

                <compilation debug="true" ... />
                

                web.config。 ;)

                【讨论】:

                  猜你喜欢
                  • 2012-06-21
                  • 2020-05-03
                  • 2021-01-14
                  • 2014-12-08
                  • 1970-01-01
                  • 2015-12-16
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-12-15
                  相关资源
                  最近更新 更多