2

目前我的 web.config 看起来像这样:

<configuration>
  <connectionStrings configSource="connectionstrings.config"/>
</configuration>

生成部署包 (Msbuild.exe + target=Package) 时,它不会“神奇地”将我的连接字符串参数化为 parameters.xml 文件以在部署时进行替换。

当我内联我的连接字符串时,一切都很好,并且为我的连接字符串生成了参数..

所以:

如何通过 web.config 转换复制 connectionstrings.config 的内容以替换我的 <... configsource="xxx"/> 部署?

编辑: 我接受了 Sayed Ibrahim 的回答,因为“默认”行为非常好(web.config 中连接字符串的自动参数化)但最后最好准确指定需要参数化的内容(通过{projectname} .wpp.targetsparameters.xml文件)。

4

1 回答 1

6

你有点问错问题了,不要担心如何转换回 web.config。相反,只需在文件中应该为连接字符串创建参数即可。我刚刚在http://sedodream.com/2012/05/13/VSWebPublishHowToParameterizeConnectionStringsOutsideOfWebconfig.aspx上写了这篇博客。我还为您粘贴了下面的内容。

如果您在 VS 2010 或 VS 11 中使用 Visual Studio Web 发布来创建 Web Deploy 包,那么您可能知道我们在 web.config 中自动参数化连接字符串。如果您不熟悉 Web 部署参数,它们是一种声明您希望在以后发布包时能够轻松更新某些值的方式。连接字符串是在发布期间通常需要更新的一些很好的例子。

正如我之前所说,如果您在 Visual Studio 中创建 Web 部署包,我们将自动为 web.config 中的所有连接字符串创建 Web 部署参数。今天早些时候,我在 StackOverflow 上看到一个问题,询问如何在非 web.config 文件中参数化连接字符串(问题实际上问了其他问题,但我认为这是他真正想要的)。我创建了一个示例来展示如何做到这一点。下面是 web.config 中 connectionStrings 元素的样子。

<connectionStrings configSource="connectionStrings.config" />

这是connectionStrings.config

<connectionStrings>
  <clear/>
  <add name="ApplicationServices"
       connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
       providerName="System.Data.SqlClient" />
  <add name="OtherConnectionString"
       connectionString="data source=.\SQLExpress;Integrated Security=SSPI;Initial Catalog=foo"
       providerName="System.Data.SqlClient"/>
</connectionStrings>

为了参数化这些连接字符串,您必须扩展 Web 发布管道。为此,在您正在工作的项目的根目录中创建一个名为 {project-name}.wpp.targets 的文件(对于 VS 11 项目,您可以将所有这些直接放在 .pubxml 文件中)。这将是一个 MSBuild 文件,它将被导入到构建/发布过程中。下面是需要创建的文件。

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

  <ItemGroup>
    <!-- Here we need to declare MSDeploy parameters for connection strings in connectionStrings.config -->
    <MsDeployDeclareParameters Include="ApplicationServices-ConnectionString" >
      <Kind>XmlFile</Kind>
      <Scope>connectionStrings.config$</Scope>
      <Match>/connectionStrings/add[@name='ApplicationServices']/@connectionString</Match>
      <Description>Connection string for ApplicationServices</Description>
      <DefaultValue>data source=(localhost);Initial Catalog=AppServices</DefaultValue>
      <Tags>SqlConnectionString</Tags>
    </MsDeployDeclareParameters>

    <MsDeployDeclareParameters Include="OtherConnectionString-ConnectionString" >
      <Kind>XmlFile</Kind>
      <Scope>connectionStrings.config$</Scope>
      <Match>/connectionStrings/add[@name='OtherConnectionString']/@connectionString</Match>
      <Description>Connection string for OtherConnectionString</Description>
      <DefaultValue>data source=(localhost);Initial Catalog=OtherDb</DefaultValue>
      <Tags>SqlConnectionString</Tags>
    </MsDeployDeclareParameters>
  </ItemGroup>

</Project>

在这里您可以看到我正在为 MSDeployDeclareParameters 创建值。打包/发布时,此项目列表用于创建 MSDeploy 参数。下面是每个包含的元数据值的解释。

  • Kind = 对于这种情况,它将始终是 Xmlfile,了解更多
  • Scope = 需要修改的文件的正则表达式
  • Match = 要更新的属性/元素的 XPath 表达式
  • 描述 = 可选描述(如果导入了 pkg,这将显示在 IIS 管理器中)
  • DefaultValue = optional 参数的默认值Tags = optional,对于连接字符串使用SqlConnectionString

创建此文件后,您需要关闭/重新打开 VS(它会缓存导入的 .targets 文件)。然后您可以创建一个 Web 部署包。当您这样做时,将声明这些新参数。就我而言,然后我将其导入 IIS 管理器,这是显示参数的对话框。 在此处输入图像描述

如您所见,此处显示了应用程序路径参数以及我的自定义连接字符串值。当我更新文本框中的值并在我的 Web 服务器上打开 connectionStrings.config 时,它们就是我在对话框中输入的值。

仅供参考,我已在ParameterizeConStringConfig将此示例上传到我的 github 帐户。

于 2012-05-13T21:24:54.630 回答