Web.config Build vs Release转换不起作用

时间:2013-01-19 15:02:14

标签: asp.net build web-config release web-config-transform

我有一个ASP.NET Web应用程序项目,它通过Entity Framework连接到远程数据库。在调试期间(例如,在我的本地计算机上运行项目),数据库的IP地址与发布期间的IP地址不同(例如,在将项目上载到我的Web服务器并从浏览器运行之后)。到目前为止,我总是手动更改Web.config文件中的数据库连接字符串以在两者之间切换(基本上我必须连接字符串,一个名为'Debug',一个'Release',我只是在部署时交换名称)。

现在我注意到应该可以通过Web.config Transformation Syntax自动发生这种情况,将修改后的连接字符串放在Web.Release.config版本中,然后在构建DLL时使用它在发布配置下。

然而它似乎对我不起作用......

以下是我的常规Web.config文件的相关部分(其中包含用于本地使用的Debug连接字符串):

<?xml version="1.0"?>
<configuration>

  <connectionStrings>
    <!-- Debug connection string. Release connection string is in Web.Release.config file -->
    <add name="DatabaseEntities" connectionString="A" providerName="System.Data.EntityClient" />
  </connectionStrings>

</configuration>

这是Web.Release.config文件,根据示例,如果DLL处于发布模式下,则应将“DatabaseEntities”连接字符串“A”替换为“B”:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <!-- Replace the DatabaseEntities connection string with the Release version (local IP address) -->
  <connectionStrings>
    <add name="DatabaseEntities"
      connectionString="B"
      xdt:Transform="Replace" xdt:Locator="Match(name)"/>
  </connectionStrings>

</configuration>

(显然“A”和“B”只是我真实连接字符串的占位符)

当我调试应用程序时(例如只按F5),使用默认的Web.config,我可以访问数据库。然后,我通过Configuration Manager将构建配置更改为Release。解决方案中的所有项目都设置为发布配置。然后我构建解决方案(仅通过构建或甚至通过完整的重建(例如,清理,重建))。我将新构建的DLL上传到Web服务器,以及Web.config和Web.Release.config文件,当我尝试访问我无法访问的数据库时,它仍然试图通过调试IP地址访问数据库因此无法找到它......

似乎完全忽略了Web.Release.config文件,或者至少没有替换连接字符串。

我做错了什么?转换语法错了吗?我没有正确地在发布模式下构建应用程序吗?

6 个答案:

答案 0 :(得分:51)

  

然后我构建解决方案(仅通过Build或甚至通过完整的   重建(例如清洁,重建))。我将新构建的DLL上传到   webserver,以及Web.config和Web.Release.config文件

有错误:如果您只是构建,Web配置转换将无法用于您的本地环境。你需要发布。

您的部署过程看起来很奇怪:您只是复制DLL,Web.config和web.Release.config。对我来说,似乎是你复制了你的源代码,而不是一个已编译的应用程序。已发布的WebApplication不包含web.release.config。

您应该将项目(右键单击WebApplication - &gt; Publish)发布到本地文件系统并从那里复制文件,或者使用您选择的其他部署方法。

2年前,我写了一篇关于web.config转换的文章。它为您提供了VS 2010的逐步教程(VS 2012中更改了发布对话框):http://www.tomot.de/en-us/article/5/asp.net/how-to-use-web.config-transforms-to-replace-appsettings-and-connectionstrings

答案 1 :(得分:3)

你可以试试Slow Cheetah插件:

http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5

通过为您提供额外的上下文菜单选项,您可以看到转换“实时”。右键单击并选择“预览变换”以查看转换而无需进行构建。它对于实现app.config转换也非常方便

答案 2 :(得分:3)

我认为只有在发布网站/应用时才会进行转换。 构建应用程序时不会这样做。后者会不断更改源代码控制下的web.config(这将是一个真正的麻烦)

答案 3 :(得分:1)

如果它只是在web.config转换过程中没有被覆盖的连接字符串,那么这就是我所做的: 我清除了“发布Web”向导的“设置”部分中的“在运行时使用此连接字符串”复选框。此设置覆盖了连接字符串的web.config转换。

答案 4 :(得分:0)

在csproj文件中,您可以添加一个要在每次构建之前执行的操作,并执行web.config转换:

<Target Name="BeforeBuild">
    <TransformXml Source="web.config" Transform="web.$(Configuration).config" Destination="web.config" />
</Target>

答案 5 :(得分:0)

它非常灵活,您应该能够进行一些调整以在构建中应用自定义转换(而无需发布)

我们在(Windows Service)项目中实现了这一点,对构建应用了转换

您将需要修改您的项目文件并添加类似于下面的内容

在这里,我们告诉msbuild在完成编译后应用转换,但前提是条件为真(请参见https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions?view=vs-2017

请注意,我们使用的是构建道具(自定义的msbuild道具)“ Env”,例如msbuild ... /p:Env=Prod将导致 App.Prod.config

<UsingTask TaskName="TransformXml" AssemblyFile="C:\Some\Path\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="Exists('some condition')">
  <!--Generate transformed app config in the intermediate directory-->
  <TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Env).config" />
  <!--Force build process to use the transformed configuration file from now on.-->
  <ItemGroup>
    <AppConfigWithTargetPath Remove="App.config" />
    <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
      <TargetPath>$(TargetFileName).config</TargetPath>
    </AppConfigWithTargetPath>
  </ItemGroup>
</Target>