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.