web-dev-qa-db-ja.com

Web.Config変換を使用した高度なタスク

値全体または属性を置き換えるのではなく、値の特定のセクションを「変換」する方法があるかどうか誰かが知っていますか?

たとえば、さまざまなWebサービスのURLを指定するappSettingsエントリがいくつかあります。これらのエントリは、開発環境と本番環境ではわずかに異なります。いくつかは他よりも些細なことではありません

<!-- DEV ENTRY -->
<appSettings>
 <add key="serviceName1_WebsService_Url" value="http://wsServiceName1.dev.domain.com/v1.2.3.4/entryPoint.asmx" />
 <add key="serviceName2_WebsService_Url" value="http://ma1-lab.lab1.domain.com/v1.2.3.4/entryPoint.asmx" />
</appSettings>

<!-- PROD ENTRY -->
<appSettings>
 <add key="serviceName1_WebsService_Url" value="http://wsServiceName1.prod.domain.com/v1.2.3.4/entryPoint.asmx" />
 <add key="serviceName2_WebsService_Url" value="http://ws.ServiceName2.domain.com/v1.2.3.4/entryPoint.asmx" />
</appSettings>

最初のエントリでは、唯一の違いは "。dev"と ".prod"です。2番目のエントリでは、サブドメインが異なります: "ma1-lab.lab1"from "ws.ServiceName2"

これまでのところ、Web.Release.Configで次のようなことができることはわかっています。

<add xdt:Locator="Match(key)" xdt:Transform="SetAttributes(value)" key="serviceName1_WebsService_Url" value="http://wsServiceName1.prod.domain.com/v1.2.3.4/entryPoint.asmx" />
<add xdt:Locator="Match(key)" xdt:Transform="SetAttributes(value)" key="serviceName2_WebsService_Url" value="http://ws.ServiceName2.domain.com/v1.2.3.4/entryPoint.asmx" />

ただし、そのWebサービスのバージョンが更新されるたびに、Web.Release.Configも更新する必要があります。これは、web.configの更新を簡素化するという目的に反します。

そのURLをさまざまなセクションに分割して個別に更新することもできますが、すべてを1つのキーにまとめています。

利用可能なweb.config変換を調べましたが、私が達成しようとしていることに対応するものは何もないようです。

これらは私が参照として使用しているウェブサイトです:

Vishal JoshiのブログMSDNヘルプ 、および Channel9ビデオ

どんな助けでも大歓迎です!

-D

41
Diego C.

実際のところ、これは可能ですが、思ったほど簡単ではありません。独自の構成変換を作成できます。これに関して、非常に詳細なブログ投稿を http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx に書いたところです。しかし、ここにハイライトがあります:

  • クラスライブラリプロジェクトの作成
  • 参照Web.Publishing.Tasks.dll(%Program Files(x86)%MSBuild\Microsoft\VisualStudio\v10.0\Webフォルダーの下)
  • Microsoft.Web.Publishing.Tasks.Transformクラスを拡張します
  • Apply()メソッドを実装します
  • アセンブリをよく知られた場所に配置します
  • Xdt:Importを使用して、新しい変換を使用可能にします
  • 変換を使用する

これは、この置換を行うために作成したクラスです

namespace CustomTransformType
{
    using System;
    using System.Text.RegularExpressions;
    using System.Xml;
    using Microsoft.Web.Publishing.Tasks;

    public class AttributeRegexReplace : Transform
    {
        private string pattern;
        private string replacement;
        private string attributeName;

        protected string AttributeName
        {
            get
            {
                if (this.attributeName == null)
                {
                    this.attributeName = this.GetArgumentValue("Attribute");
                }
                return this.attributeName;
            }
        }
        protected string Pattern
        {
            get
            {
                if (this.pattern == null)
                {
                    this.pattern = this.GetArgumentValue("Pattern");
                }

                return pattern;
            }
        }

        protected string Replacement
        {
            get
            {
                if (this.replacement == null)
                {
                    this.replacement = this.GetArgumentValue("Replacement");
                }

                return replacement;
            }
        }

        protected string GetArgumentValue(string name)
        {
            // this extracts a value from the arguments provided
            if (string.IsNullOrWhiteSpace(name)) 
            { throw new ArgumentNullException("name"); }

            string result = null;
            if (this.Arguments != null && this.Arguments.Count > 0)
            {
                foreach (string arg in this.Arguments)
                {
                    if (!string.IsNullOrWhiteSpace(arg))
                    {
                        string trimmedArg = arg.Trim();
                        if (trimmedArg.ToUpperInvariant().StartsWith(name.ToUpperInvariant()))
                        {
                            int start = arg.IndexOf('\'');
                            int last = arg.LastIndexOf('\'');
                            if (start <= 0 || last <= 0 || last <= 0)
                            {
                                throw new ArgumentException("Expected two ['] characters");
                            }

                            string value = trimmedArg.Substring(start, last - start);
                            if (value != null)
                            {
                                // remove any leading or trailing '
                                value = value.Trim().TrimStart('\'').TrimStart('\'');
                            }
                            result = value;
                        }
                    }
                }
            }
            return result;
        }

        protected override void Apply()
        {
            foreach (XmlAttribute att in this.TargetNode.Attributes)
            {
                if (string.Compare(att.Name, this.AttributeName, StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    // get current value, perform the Regex
                    att.Value = Regex.Replace(att.Value, this.Pattern, this.Replacement);
                }
            }
        }
    }
}

これがweb.configです

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="one" value="one"/>
    <add key="two" value="partial-replace-here-end"/>
    <add key="three" value="three here"/>
  </appSettings>
</configuration>

これが私の設定変換ファイルです

<?xml version="1.0"?>

<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">

  <xdt:Import path="C:\Program Files (x86)\MSBuild\Custom\CustomTransformType.dll"
              namespace="CustomTransformType" />

  <appSettings>
    <add key="one" value="one-replaced" 
         xdt:Transform="Replace" 
         xdt:Locator="Match(key)" />
    <add key="two" value="two-replaced" 
         xdt:Transform="AttributeRegexReplace(Attribute='value', Pattern='here',Replacement='REPLACED')" 
         xdt:Locator="Match(key)"/>
  </appSettings>
</configuration>

これが変換後の結果です

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="one" value="one-replaced"/>
    <add key="two" value="partial-replace-REPLACED-end"/>
    <add key="three" value="three here"/>
  </appSettings>
</configuration>
67

更新と同様に、Visual Studio 2013を使用している場合は、代わりに%Program Files(x86)%MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.XmlTransform.dllを参照する必要があります。

3