asp.net 使用Visual Studio web.config转换进行调试[重复]

wlwcrazw  于 2023-03-31  发布在  .NET
关注(0)|答案(5)|浏览(173)

此问题在此处已有答案

10年前关闭了。

可能重复:

How can I use Web.debug.config in the built-in visual studio debugger server?
我想使用Web.config转换,它可以很好地用于发布和调试。
当我发布一个web应用时,Visual Studio会根据我当前的构建配置自动转换Web.config。我如何在开始调试时告诉Visual Studio做同样的事情?在调试启动时,它只是使用默认的Web.config而不进行转换。
有什么想法吗?

ut6juiuv

ut6juiuv1#

好的,理解web.debug.configweb.release.config仅用于打包/发布。我已经想出了一种方法来实现你正在尝试做的事情。我在https://devblogs.microsoft.com/aspnet/asp-net-web-projects-web-debug-config-web-release-config/上写了博客。下面是摘要。
现在让我们来看看如何实现提问者想要做的事情。
概括一下,当他在一个特定的配置上构建时,他希望对web.config应用一个特定的转换,所以很明显你不想维护一个web.config文件,因为它会被覆盖。
因此,我们需要做的是创建一个新文件web.template.config,它只是web.config的副本。然后使用Windows资源管理器删除web.config(不要使用Visual Studio删除,因为我们不想从项目中删除它)。

注意:如果您使用的是集成到Visual Studio中的源代码管理提供程序,则可能需要从源代码管理中删除web.config。

同样,我们不想使用web.debug.configweb.release.config,因为它们在Web发布管道中已经有了明确的角色,所以我们不想打扰它。因此,我们将在项目和web.template.configweb.dev.debug.configweb.dev.release.config的同一个文件夹中创建两个新文件。
这个想法是,这些将是在调试或运行时应用的转换,现在我们需要连接到构建/打包/发布过程中,以便将这一切都连接起来。(WAP)有一个扩展点,您可以在同一个文件夹中创建一个名为{ProjectName}.wpp.targets的项目文件,其中{ProjectName}是项目的名称。如果此文件在磁盘上与WAP位于同一个文件夹中,则它将自动导入到项目文件中。因此,我创建了此文件。并且我放置了以下内容:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- Make sure web.config will be there even for package/publish -->
  <Target Name="CopyWebTemplateConfig" BeforeTargets="Build">
    <Copy SourceFiles="web.template.config"
          DestinationFiles="web.config"/>
  </Target>
  
  <PropertyGroup>
    <PrepareForRunDependsOn>
      $(PrepareForRunDependsOn);
      UpdateWebConfigBeforeRun;
    </PrepareForRunDependsOn>
  </PropertyGroup>

  <!-- This target will run right before you run your app in Visual Studio -->
  <Target Name="UpdateWebConfigBeforeRun">
    <Message Text="Configuration: $(Configuration): web.dev.$(Configuration).config"/>
    <TransformXml Source="web.template.config"
              Transform="web.dev.$(Configuration).config"
              Destination="web.config" />
  </Target>

  <!-- Exclude the config template files from the created package -->
  <Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
    <ItemGroup>
      <ExcludeFromPackageFiles Include="web.template.config;web.dev.*.config"/>
    </ItemGroup>
    <Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
  </Target>
</Project>

我创建了CopyWebTemplateConfig目标,它将始终在构建时复制web.template.configweb.config,即使您没有在Visual Studio中调试应用程序。
这是必要的,因为我们仍然需要支持Visual Studio的打包/发布过程。然后我扩展了属性PrepareForRunDependsOn以包含UpdateWebConfigBeforeRun目标。此属性用于标识在从Visual Studio运行任何托管项目之前需要执行的目标列表。
在这个目标中,我使用TransformXml任务来转换web.template.config,使用正确的web.dev.***.config文件。之后,您的应用根据您的构建配置使用正确的web.config启动。之后,我有另一个目标ExcludeCustomConfigTransformsFiles,我通过属性BeforeTargets=”ExcludeFilesFromPackage”将其注入到打包/发布过程中,这是必需的,因为我们不希望在打包或发布应用程序时包含这些文件。所以这就是它的全部。
为了解释这个场景的打包/发布过程。当你打包/发布web.debug.configweb.release.config时,根据构建配置,仍然会使用。但最终它转换的文件是web.template.config,所以你可能需要根据该文件中的内容进行调整。问题/评论

hkmswyz6

hkmswyz62#

安德鲁是在正确的道路上。当你使用这个功能时,这里是它的设计使用方式。

web.config这是开发者应该在本地使用的配置文件。理想情况下,你应该将其标准化。例如,你可以使用localhost作为DB字符串,等等。你应该努力使其在开发机器上工作而不需要更改。
web.debug.config这是在将应用程序发布到开发过渡环境时应用的转换。这将对目标环境所需的web.config进行更改。
web.release.config这是当您将应用程序发布到“生产”环境时应用的转换。显然,您必须根据您的应用程序/团队小心使用密码。

转换当前运行的web.config的问题在于,转换可能会对web. config执行破坏性操作。例如,它可能会删除属性、删除元素等。

wpx232ag

wpx232ag3#

您可以只使用“默认”的web.config作为您的开发/调试版本,然后web.release.config当然会继续作为发布版本,因为它的转换在您发布时应用。

mv1qrgav

mv1qrgav4#

在调试配置中,添加一个构建后步骤,并使用它来替换/转换web.config

5jvtdoz2

5jvtdoz25#

虽然我同意最简单的方法通常是最好的,但我可以很容易地想象这样一种情况:在一段时间内,您希望将IDE连接到测试数据库而不是开发数据库。尽管您可以在默认的web.config文件中指定开发连接字符串,但如果有一个Web.Test.config文件,那么当您将构建配置交换为“Test”时,你会自动获得新的设置,而仍然在你的IDE。
历史上的替代方法是注解掉一组连接字符串,而另一组连接字符串,但是这些新的配置转换最终给了人们一个机会,让人们可以在这种丑陋的做法中找到答案。虽然一个默认的开发文件和一个转换的发布文件可能在很多时候都是有效的,但是在我看来,添加一个构建后的步骤来转换web.config文件是更完整的答案。

相关问题