【问题标题】:How to convert configSource to inline elements in web.config on transformation如何在转换时将 configSource 转换为 web.config 中的内联元素
【发布时间】:2012-05-11 18:49:30
【问题描述】:

目前我的 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 文件)。

【问题讨论】:

    标签: msbuild web-config msdeploy web-config-transform config-transformation


    【解决方案1】:

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

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

    正如我之前所说,如果您在 Visual Studio 中创建 Web 部署包,我们将自动为 web.config 中的所有连接字符串创建 Web 部署参数。今天早些时候我看到了一个question on StackOverflow asking how to parameterize connection strings in non-web.config files(这个问题实际上问了别的问题,但我认为这是他真正想要的)。我创建了一个示例来展示如何做到这一点。下面是 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,learn more
    • Scope = 需要修改的文件的正则表达式
    • 匹配 = 要更新的属性/元素的 XPath 表达式
    • Description = 可选描述(如果导入了 pkg,这将显示在 IIS 管理器中)
    • DefaultValue = optional 参数的默认值Tags = optional,对于连接字符串使用SqlConnectionString

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

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

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

    【讨论】:

    • 不需要添加包含详细 MsBuild 语法的 {projectname}.wpp.targets。您还可以在 webroot 中添加一个 parameters.xml 文件,该文件的语法与 parameters.xml 文件(在部署包中找到)相同。以我的 github 帐户为例:github.com/crunchie84/ParameterizeConnectionStringsConfig.
    • 我应该将其列为一个选项,我将在今晚晚些时候更新帖子,并提供有关该方法的详细信息。它们都归结为同一件事(parameters.xml 被转换为我展示的 MSBuild 项)。
    猜你喜欢
    • 2017-03-23
    • 2012-03-24
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多