7

我需要设置debug='false'

<compilation debug="false" targetFramework="4.0" /> 

即使以Release Mode发布我的代码。

编辑 1

如 MSDN Compilation Overview 中所述,它分两个阶段完成

  1. 在第一阶段,它将代码编译成一个或多个程序集
  2. 在第二个阶段,将 MSIL 转换为特定于 CPU 的指令,供运行应用程序的计算机上的处理器使用

是否发布代码意味着阶段 1 部分和
<compilation ....阶段 2。

4

6 回答 6

6

我不完全理解你的问题。如果您询问是否需要手动设置 debug='false' 那么答案将取决于项目中是否存在具有配置转换的文件的事实。当前的 Visual Studio 标准 Web 项目模板包括两个具有配置转换的文件:Web.Debug.config 和 Web.Release.config。这些文件包含要在发布代码期间应用的配置转换。这是默认 Web.Release.config 文件的示例:

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an atrribute "name" that has a value of "MyDB".

    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->

    <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.

      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration> 

因此,如果您有内容与上述类似的 Web.Release.config 转换文件,并且您使用 Visual Studio 的发布功能(或根据 msbuild 目标),那么当您在发布中发布项目时,将删除 debug='true' 属性模式。

从 web 配置中删除 debug='true' 有很多好处。此设置不仅对编译的 dll 有效,而且会影响将加载的 MS Ajax 脚本的版本(如果您使用 ASP.NET Web 表单和脚本管理器控件)。MS Ajax 库的调试版本有很多检查(参数验证等),这些检查已从脚本的发布版本中删除。这就是调试版本运行缓慢的原因。

于 2013-06-18T21:28:07.547 回答
3

对于debug=truevsdebug=false讨论,在生产系统中,在发布到生产环境时关闭调试有很多好处。其他答案和评论对此进行了更详细的说明(我在 MVC4 应用程序中注意到的一大优势是 JS 和 CSS 捆绑包在调试关闭时被缩小)。

关于以Release模式发布是否足够的问题,请阅读以下内容:

如果您使用的是新 ASP.NET 项目附带的现成转换文件,则不需要,您不需要手动设置它。但是,如果您没有转换文件或者您没有使用它们,那么在发布到生产环境时,您应该更改该设置。

基本上,当您发布 ASP.NET 网站时,它会做的是构建应用程序,应用适当的 web.config 转换(基于使用“发布 Web”功能时在“设置”部分中选择的配置 -我假设是您选择“发布”模式的位置),然后将代码发布到指定位置。

通常,为了让您开始转换,当您在 Visual Studio 中创建 ASP.NET 应用程序时,将为您的 web.config 提供两个转换:web.Debug.configweb.Release.config(您可以通过单击 web.config 旁边的展开符号来查看它们文件)。

如果您没有任何转换,您可以通过右键单击 web.config 文件并选择“添加转换配置”来创建它们,并且将为您在解决方案中拥有的各种构建配置创建转换文件。

正如 Maxim Kornilov 在他的回复中提到的,开箱即用的 web.Release.config 包含这个重要的转换行:<compilation xdt:Transform="RemoveAttributes(debug)" />,它告诉应用程序debug从标签中删除属性<compilation,这将使应用程序在关闭调试的情况下发布。

注意:如果您在发布时选择的配置转换中没有看到RemoveAttributes(debug),那么代码可能会在调试模式下发布。

如果您真的想确定转换是如何工作的,请在发布后查看 web.config 的内容,您将看到转换的输出

此外, http ://webconfigtransformationtester.apphb.com/上还有一个工具可以让您测试 web.config 转换将如何影响您的 web.config 文件。

最后,我非常喜欢使用构建服务器并在代码准备好上线时构建发布我的代码(更少的人需要以这种方式直接访问服务器),所以 web.config 转换对我有很大帮助,从允许我根据我正在部署的环境更改连接字符串,以及管理不同环境的警告消息等(例如,警告:测试系统,不要输入真实数据)。通过使用转换,设置的主要集合可以保留在 web.config 文件中(与本地开发设置一起,因为按 F5 通常不会应用转换,除非您将其发布到本地进行测试),并且每个环境都有自己的自己的配置转换,它存在于源代码控制中,并且具有相同的分支,

于 2013-06-24T20:46:17.070 回答
3

是的,您需要使用 debug="false"。

ASP .Net 解析 .aspx 或视图并创建一些与您使用 Visual Studio 编译的不同的 dll。此设置适用于这些 dll。

ASP.NET 编译概述http://msdn.microsoft.com/en-us/library/ms178466(v=vs.100).aspx

于 2013-06-14T11:47:19.697 回答
1

理论

2006 年的这篇文章列出了以下效果debug="true"

  1. ASP.NET 请求不会超时:出于明显的调试目的
  2. 批量编译关闭:页面和控件编译成单独的程序集
  3. 代码优化:JIT 编译器生成更高效的代码

数字 3. 基本上与 Release 模式编译所做的相同。

代码参考

System.Web.Configuration.CompilationSection.Debug为了进行更多调查,我在我的一个关于 Framework 4.0 的 Web 项目中使用了 Re# 。发现的用法是:

  1. System.Web.Configuration.BrowserCapabilitiesCodeGenerator.GenerateAssembly
  2. System.Web.Configuration.CompilationSection.GetCompilerInfoFromExtension
  3. System.Web.Configuration.CompilationSection.GetCompilerInfoFromLanguage
  4. System.Web.Compilation.CompilationUtil.GetRecompilationHash
  5. System.Web.HttpRuntime.InitDebuggingSupport
  6. System.Web.Compilation.CompilationUtil.IsDebuggingEnabled

这些似乎都与上面提到的3点有关。

运行时效果

请注意,调试标志会影响

  1. 即时编译
  2. 预编译(通过wdproj
  3. MSDeploy

虽然最终效果基本相同,但更改标志对任何即时编译的代码(如 wdproj 预编译)没有优化效果。

捆绑

此外,调试标志还有至少 1 种其他用途:使用资源包。当 app/web 配置中的调试标志打开时,捆绑的 JS 和 CSS 将原样输出。

于 2013-06-24T21:04:00.573 回答
1

您不需要指定 debug="false"。你可以省略它并离开

<compilation targetFramework="4.5" /> 

IIS 假定调试为假。

于 2017-01-19T12:10:58.857 回答
0

你应该。该debug="true"开关应仅在开发期间使用。

于 2013-06-14T14:34:41.060 回答