【问题标题】:How can I identify whether an ASP.NET site is being run "normally" or in "debug" via Visual Studio?如何通过 Visual Studio 识别 ASP.NET 站点是“正常”运行还是“调试”运行?
【发布时间】:2025-11-23 05:45:02
【问题描述】:

我如何确定我的网站在什么“模式”下运行?

在这种特定情况下,我在代码隐藏页面中有代码应该在“发布”模式下以一种方式运行 - 即有人使用浏览器在那里导航,如果我处于来自 VS2008 的调试模式,则另一种方式. (例如识别要使用的 SQL 连接字符串、是否显示某些错误或警告消息等)

VS2008 被配置为通过 IIS 有多种原因(Cassini 不是一个选项)。

搜索所有帮助我找不到任何东西,但必须有一种方法来确定网站是如何启动的。

提前致谢。

【问题讨论】:

    标签: asp.net visual-studio visual-studio-2008 debugging


    【解决方案1】:

    我不确定你的意思。如果您想知道应用程序当前是否正在调试,可以检查System.Diagnostics.Debugger.IsAttached 属性。如果你想知道应用程序是否在调试模式下编译,那么你可以这样做:

    #if DEBUG
       const bool DebugMode = true;
    #else
       const bool DebugMode = false;
    #endif
    

    另外,你可以使用 ConditionalAttribute:

    [System.Diagnostics.Conditional("DEBUG")]
    public void ThisMethodWillOnlyExecuteInDebugMode()
    {
    }
    

    我强烈建议重新考虑这一点 - 根据我的经验,具有不同的发布和调试行为是将错误引入生产代码的绝佳方式。

    【讨论】:

    • 这就是诀窍。检查 System.Diagnostics.Debugger.IsAttached 属性告诉我确切地我需要知道什么。我们将使用它的唯一地方是将用户/开发人员分派到实时/测试数据库。
    【解决方案2】:
    HttpContext.Current.IsDebuggingEnabled
    

    this article

    【讨论】:

    • 不幸的是,现在,无论我是在 VS2008 中按 F5 还是在 IE7 中手动导航到 server/app/page.aspx,它总是返回“True”
    【解决方案3】:

    我用这个方法检测编译段是否开启了debug:-

    bool DebugModeOn()
    {
        System.Web.Configuration.CompilationSection configSection =
                 (System.Web.Configuration.CompilationSection)HttpContext.Current.GetSection("system.web/compilation");
        return configSection.Debug;
    
    }
    

    这并不完全符合您的要求。但是,由于这在生产中应该是错误的,而在开发中应该是正确的,所以它可能已经足够好了。

    编辑:或者您可以像 Olivier PAYEN 指出的那样简单地使用上下文的 IsDebuggingEnabled 属性。 :P 哎呀。

    【讨论】:

      【解决方案4】:

      我会用

      #if DEBUG
          // ...
      #else
          // ...
      #endif
      

      然而,我只会在“Main”方法中将其用于异常捕获:

      • 如果调试,则不要捕获(因此调试器可以捕获任何未捕获的异常),
      • 如果发布,则显示错误页面。

      这些不会改变程序的流程,只是不要那样做,有龙:)

      例如,如果您查看连接字符串,我会将它们放在 web.config 中。

      【讨论】:

      • 连接字符串肯定会在 web.config 中——一旦我们解决了一些配置问题,就会加密。我们在这里试图确定的是开发人员正在测试站点还是用户正在运行它(因此我们知道要使用哪个连接字符串,例如)。