• 一种Webconfig自动化升级方法


    1、方法功能

    使用本方法,可以将开发环境最新版本的web.config结构与生产环境环境的config融合,而不用考虑两个config的版本差异值是多少。使用一种标记的方式,在开发环境webconfig上标记哪些节点的哪些属性需要保留为生产环境对应的值,而这种标记不影响开发环境web.config的使用。

    2、适用范围

    1、将开发环境的webconfig更新到生产环境,不再需要手动改配置值;

    2、在多个生产环境中,使用同一份开发环境的webconfig,可转换得到适合本生产环境的最终config;

    3、设计依赖

    本方法有两个依赖:灵活的xml处理指令标记与逻辑固定的指令解释器,扩展在于指令标记而不是解释器。

    3.1灵活的xml处理指令标记

    开发环境的webconfig中,在希望保存原有配置值的元素之上写上处理指令,目标为"merge"。对于集合下相同名称的的元素,使用by来指示唯一标识的属性名称是什么,像appSettings下的元素,by="key";使用attr来指示需要保留原有配置值的属性名称,缺省为全部属性,可以写单个,多个中间半角逗号分隔。以下红色部分就是merge指令,它的存在不会影响到开发环境中webconfig本身的正确性。

    <appSettings>
      <add key="useLocalIPAdress" value="false"/>
    
      <!--通过节点的key属性来合并value-->
      <?merge by="key" attr="value"?>   
      <add key="localIPAdress" value="192.168.1.99" />
    
      <!--通过节点的key属性来合并所有属性-->
      <?merge by="key"?>
      <add key="useProxy" value="true" />
    </appSettings>
    <!--通过节点名称来合并account,password,sex,age-->
    <?merge attr="account,password,sex,age" ?>
    <admin account="admin" password="123456" sex="男" age="18" enable="true" />

    3.2固定的指令解释器

    解释器的功能是将带有指令的config当作xml解析,遍历所有元素,如果元素之上存在"merge"指令,则解析指令的数据内容,通过by的值或自身的节点名称,从旧的config中读取相配的节点,按照attr描述,进行将旧config的值复制过来,最终得到一份融合后的xml数据,转存为web.config文件即可。由于功能单一与逻辑固定,解释器本身不需要进行更新,合并xml大体方法如下:

    /// <summary>
    /// 将valueXml的值与markXml的结构合并
    /// 返回得到的新的xml
    /// </summary>
    /// <param name="valueXml">带有值的xml</param>
    /// <param name="markXml">带有标记的xml</param>    
    /// <returns></returns>
    public static string MergeXml(string valueXml, string markXml)
    {
        var valueDoc = XDocument.Parse(valueXml);
        var markDoc = XDocument.Parse(markXml);
        var markElements = markDoc.Descendants().ToArray();
    
        foreach (var markElement in markElements)
        {
            var mergeMark = markElement.GetMergeMark();
            if (mergeMark == null)
            {
                continue;
            }
    
            if (string.IsNullOrEmpty(mergeMark.By) == false)
            {
                var byAttr = markElement.Attribute(mergeMark.By);
                var xPath = markElement.GetAbsoluteXPath(byAttr);
                valueDoc.XPathSelectElement(xPath).CopyAttrValuesTo(markElement, mergeMark.Attr);
            }
            else
            {
                var xPath = markElement.GetAbsoluteXPath();
                valueDoc.XPathSelectElement(xPath).CopyAttrValuesTo(markElement, mergeMark.Attr);
            }
        }
        return markDoc.ToString();
    }


    为了简单,我做了一下文件右键菜单关联,人工更新web.config更方便:

    4、项目与下载

    https://github.com/xljiulang/ConfigMerge

  • 相关阅读:
    浏览器事件大全!
    IE 的 Session 处理
    多个Cache的异同。
    flexSDK 添加 swc资源
    flashBuilder 严格类型检查
    自定义事件
    as3类的链接问题
    FLEX SDK嵌入资源
    从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势
    PowerDesigner创建Oracle数据库序列实现自动增长
  • 原文地址:https://www.cnblogs.com/kewei/p/7572650.html
Copyright © 2020-2023  润新知