使web.config动态化

时间:2015-02-20 19:00:58

标签: c# .net web-config web.config-transform

我们有一个应用程序,它被部署在不同的管道中,专用于各种版本。

前管道A--专门用于行军释放 管道B - 六月发布等

在每个管道中我们有各种环境,如DEV,SIT等

现在,在发布时,在部署代码时,我们需要在webcofig文件中进行更改,因为我们在配置中的url是管道和环境相关的。

例如,我们有一个Web服务器 - 用于开发环境的方框1。 我们将管道A,管道B部署为网站。管道A的web.config看起来像 -

<configMap hostnameList="box1" name="DevEnvironment">
      <include set="Dev" />
</configMap>
<configSet name="Dev">
<add key="someUrl" value="http://somapp-piplelineA-Dev.app.com"/>
</configSet>

管道B的web.config看起来像 -

<configMap hostnameList="box1" name="DevEnvironment">
      <include set="Dev" />
</configMap>
<configSet name="Dev">
<add key="someUrl" value="http://somapp-piplelineB-Dev.app.com"/>
</configSet>

如果您看到此配置,则在key someurl的值中,pipelineA已更改为pipelineB。当有很多钥匙时,这种变化很烦人。因此,我们希望创建一个可供所有环境使用且不需要任何更改的web.config。

3 个答案:

答案 0 :(得分:4)

使用Octopus Deploy,您可以半自动或全自动部署Web应用程序。但它也可以分别为每个环境执行Web.config Transformation

答案 1 :(得分:3)

您可以使用Visual Studio内置的config transforms ability

如果您创建一个新的asp .net Web项目,您将在web.debug.configweb.release.config内看到一个示例。

您也可以右键单击web.config并单击添加配置转换,您将为每个构建配置配置一个配置转换文件。

您也可以使用SlowCheetah。这是一个非常方便的扩展。

答案 2 :(得分:2)

这是我实现的,允许我们根据构建类型动态创建配置,利用构建事件。

这将允许你有1个配置来统治它们:)

https://xmlpreprocess.codeplex.com/

项目说明

XmlPreprocess是一个命令行实用程序,可以像代码预处理器一样修改带注释的XML文件。将配置文件部署到不同的环境进行替换(例如连接字符串)非常有用。它可以轻松集成到几乎任何脚本,构建工具或部署包中,以简化和集中部署策略。

我的构建活动

C:\XMLPreprocessor\XmlPreprocess.exe /i "C:\AppConfig\Core.config" /dbkind mssql /db "Server=localhost\SQLEXPRESS;Database=DB1;User Id=dbreader; Password=pass1;" /e $(ConfigurationName)

这是我的配置XML文件的示例{} params是从包含发布类型(1 = Debug,2 = Test,3 = Release)的SQL配置数据库中检索的,并且相应地填充了值。

<Nini>
     <Section Name="AppSettings">
      <!-- ifdef _xml_preprocess -->
      <!--
     <Key Name="RSAKeyStrength" Value="${RSAKeyStrength}"/>
        <Key Name="EventLog_Name" Value="{EventLog_Name}"/>
        <Key Name="DomainAddress" Value="${DomainAddress}"/>
        <Key Name="AuthIssuer" Value="${AuthIssuer}"/>
    -->
    <!-- else -->
    <Key Name="RSAKeyStrength" Value="2048"/>
        <Key Name="EventLog_Name" Value="MyApp"/>
        <Key Name="DomainAddress" Value="mydomain.com"/>
        <Key Name="AuthIssuer" Value="auth.domain.com"/>
    <!-- endif -->
  </Section>

  <Section Name="ConnectionStrings">
    <!-- ifdef _xml_preprocess -->
    <!--
    <Key Name="IdentityUserModelEntities" Value="data source=${DB1ConnectionString};MultipleActiveResultSets=True"/>
        <Key Name="DB1ModelEntities" Value="data source=${DB1ConnectionString};MultipleActiveResultSets=True"/>
        <Key Name="LoggingDB1Entities" Value="data source=${LoggingDB1ConnectionString};MultipleActiveResultSets=True"/>
    -->
    <!-- else -->
    <Key Name="IdentityUserModelEntities" Value="data source=localhost\SQLEXPRESS;initial catalog=DB1;user id=admin;password=pass1;MultipleActiveResultSets=True"/>
        <Key Name="DB1ModelEntities" Value="data source=localhost\SQLEXPRESS;initial catalog=DB1;user id=admin;password=pass1;MultipleActiveResultSets=True"/>
        <Key Name="LoggingDB1Entities" Value="data    source=localhost\SQLEXPRESS;Initial Catalog=LoggingDB1;user id=logging_admin;Password=pass1;MultipleActiveResultSets=True"/>
    <!-- endif -->
     </Section>
    </Nini>
相关问题