Web.config dönüşümünü kullanarak “Değiştir veya Ekle” yapmanın herhangi bir yolu var mı?


183

Farklı ortamlar için yapılandırmalar oluşturmak amacıyla aşağıdaki yazıda açıklandığı gibi web.config dönüşümünü kullanıyorum.

http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html

Anahtar ile eşleştirerek bir "Değiştir" dönüşümü yapabilirim, ör.

<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />

Ve "Ekler" yapabilirim

<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" />

Ama ne gerçekten yararlı bulurdum bir ReplaceOrInsert dönüşüm, her zaman belirli bir anahtarı olan / olmayan orijinal yapılandırma dosyasına güvenemiyorum gibi.

Bunu yapmanın bir yolu var mı?


sağladığınız bağlantı şu an için çalışmıyor. Konsepti kolayca anlamak için başka bağlantınız var mı?
— Ashish-BeJovial

@AshishJain bağlantı benim için iyi çalışıyor
— Chris Haines

Yanıtlar:


105

Ucuz bir çözüm buldum. Güzel değil ve "Değiştir veya Ekle" olması gereken çok sayıda öğeniz varsa çok iyi çalışmaz.

Bir "Kaldır" ve ardından "InsertAfter | InsertBefore" yapın.

Örneğin,

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
  <deny users="?"/>
  <allow users="*"/>
</authorization>

17
VS2012 kullanıyorsanız, şimdi daha iyi bir çözüm var. Aşağıya bakın stackoverflow.com/a/16679201/32055
— Chris Haines

1
"InsertIfMissing" gerekirse Ekle ve Değiştir?
— Jessy

InsertAfter kullanımı sayesinde bu seçeneği diğerine tercih ederim. Yine de bir Kaldır yapıyorsanız InsertIfMissing bir anlam ifade etmiyor.
— Shane Courtrille

125

VS2012 ile birlikte xdt:Transform="Remove"kullanılır xdt:Transform="InsertIfMissing".

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
  <deny users="?"/>
  <allow users="*"/>
</authorization>

Mükemmel! Biz bunu bekliyorduk.
— Chris Haines

9
Bu hiç OP istekleri olarak yapmaz.
— BradLaney

2
Cevap, orijinal soruyu nasıl yanıtladığını daha net göstermek için düzenlenmiştir.
— Bon

25
Anlamıyorum. Kaldırırsanız, elbette eksik olacak, o noktada sadece bir Ekle, değil mi?
— Chad Schouggins

6
@ChadSchouggins zorunlu değildir: Removegörev yalnızca ilk olayı kaldırır. Bazı öğelerin birden fazla oluşumu olabilir. Bunu isteyeceğinizi düşünemiyorum, ama sonra ilk olayı kaldıracak ve InsertIfMissinggörevi atlayacak . Ama onun RemoveAllyerine kullansaydın haklı olabilirsin .
— Steven Liekens

89

InsertIfMissingAppSetting öğesinin var olduğundan emin olmak için dönüşümü kullanın .
Sonra Replacedeğerini ayarlamak için dönüşümü kullanın.

<appSettings>
  <add key="Environment" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>

Bunun SetAttributesyerine dönüşümü de kullanabilirsiniz Replace. Fark, SetAttributesalt düğümlere dokunmamasıdır.

<appSettings>  
  <add key="UseLivePaymentService" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="UseLivePaymentService" value="true" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>

Bu teknikler, mevcut düğümler üst düğümlerinin altına taşınmadıklarından, remove + insert'ten çok daha iyidir. Sonuna yeni düğümler eklenir. Varolan düğümler kaynak dosyada oldukları yerde kalır.

Bu yanıt yalnızca Visual Studio'nun (2012 veya daha yeni) daha yeni sürümleri için geçerlidir.


7

Benim için daha iyi bir yöntem, öğeyi yalnızca belirli özellikleri ayarladığım için yoksa yoksa eklemekti. Öğenin kaldırılması, varsa ana öğenin diğer niteliklerini silecektir.

örnek: web.config (öğesiz)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

web.config (öğeyle)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceDebug httpsHelpPageEnabled="true" />
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

Bulucu'yu bir XPath ifadesiyle kullanarak, yoksa düğümü eklerim ve özniteliğimi ayarlarım:

<serviceDebug xdt:Transform="Insert"
  xdt:Locator="XPath(/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior[not(serviceDebug)])" />
<serviceDebug includeExceptionDetailInFaults="true" xdt:Transform="SetAttributes" />

sonuçta ortaya çıkan her iki web.config dosyasında includeExceptionDetailInFaults = "true" bulunur ve ikincisi, remove / insert yönteminin yapmayacağı httpsHelpPageEnabled özniteliğini korur.


1
Bu fikri seviyorum, ancak öğe zaten "Kaynak belgede hiçbir öğe eşleşmiyor ..." varsa bir hata alıyorum. Yani, varsa, "değil" başarısız oluyor, bu yüzden bir hata.
— goodeye

Bu, yeni (ish) "InsertIfMissing" öğesini desteklemeyen XDT sürümlerini kullanırken ihtiyacınız olan tekniktir.
— IanBru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.