มีวิธีการ "แทนที่หรือแทรก" โดยใช้การแปลง web.config หรือไม่


183

ฉันใช้การแปลง web.config ตามที่อธิบายไว้ในโพสต์ด้านล่างเพื่อสร้าง configs สำหรับสภาพแวดล้อมที่แตกต่างกัน

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

ฉันสามารถทำการแปลง "แทนที่" โดยการจับคู่กับกุญแจเช่น

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

และฉันสามารถทำ "ส่วนแทรก" เช่น

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

แต่สิ่งที่ฉันจะพบว่ามีประโยชน์จริงๆก็คือการแปลง ReplaceOrInsert เนื่องจากฉันไม่สามารถพึ่งพาไฟล์ปรับแต่งดั้งเดิมที่มี / ไม่มีคีย์ที่แน่นอน

มีวิธีการทำเช่นนี้?


ลิงก์ที่คุณระบุไม่สามารถใช้งานได้ในตอนนี้ คุณมีลิงค์อื่น ๆ ที่จะเข้าใจแนวคิดได้ง่าย ๆ
Ashish-BeJovial

@AshishJain ลิงก์ใช้งานได้ดีสำหรับฉัน
Chris Haines

คำตอบ:


105

ฉันพบวิธีแก้ปัญหาราคาถูก มันไม่สวยและใช้งานได้ไม่ดีนักหากคุณมีองค์ประกอบมากมายที่ต้องเป็น "แทนที่หรือแทรก"

ทำ "ลบ" จากนั้นเลือก "InsertAfter | InsertBefore"

ตัวอย่างเช่น,

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

17
หากใช้ VS2012 ตอนนี้จะมีวิธีแก้ปัญหาที่ดีกว่า ดูด้านล่างstackoverflow.com/a/16679201/32055
Chris Haines

1
"InsertIfMissing" จะแทรกและแทนที่หากจำเป็นหรือไม่
Jessy

ฉันชอบตัวเลือกนี้มากกว่าอีกอันหนึ่งเนื่องจากการใช้ InsertAfter InsertIfMissing ไม่สมเหตุสมผลถ้าคุณกำลังทำการลบอยู่ดี
Shane Courtrille

125

ใช้ร่วมกับการxdt:Transform="Remove"ใช้งานxdt:Transform="InsertIfMissing"ใน VS2012

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

ที่สมบูรณ์แบบ! นี่คือสิ่งที่เรารอคอย
Chris Haines

9
สิ่งนี้ไม่ได้ทำตามคำขอ OP เลย
BradLaney

2
คำตอบได้รับการแก้ไขเพื่อแสดงให้เห็นอย่างชัดเจนยิ่งขึ้นว่าจะตอบคำถามเดิมอย่างไร
Bon

25
ฉันไม่เข้าใจ หากคุณลบมันออกไปแน่นอนว่ามันจะหายไปมันเป็นเพียงส่วนแทรก ณ จุดนั้นใช่ไหม
ชาด Schouggins

6
@ChadSchouggins ไม่จำเป็นว่า: Removeงานจะลบสิ่งที่เกิดขึ้นครั้งแรกเท่านั้น องค์ประกอบบางอย่างอาจมีหลายเหตุการณ์ ฉันไม่สามารถจินตนาการได้ว่าคุณต้องการสิ่งนี้ แต่จากนั้นมันจะลบสิ่งที่เกิดขึ้นครั้งแรกและข้ามInsertIfMissingงาน แต่คุณคงจะถูกถ้าเขาใช้RemoveAllแทน
Steven Liekens

89

ใช้การInsertIfMissingแปลงเพื่อให้แน่ใจว่ามีการตั้งค่าแอพ
จากนั้นใช้การReplaceแปลงเพื่อตั้งค่า

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

คุณสามารถใช้การSetAttributesแปลงแทนReplaceได้ ความแตกต่างคือSetAttributesไม่ได้แตะโหนดลูก

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

เทคนิคเหล่านี้ดีกว่าการเอาการแทรก + ออกเนื่องจากโหนดที่มีอยู่จะไม่ย้ายไปที่ด้านล่างของโหนดหลัก โหนดใหม่จะต่อท้าย โหนดที่มีอยู่จะคงอยู่ที่ใดในไฟล์ต้นฉบับ

คำตอบนี้ใช้ได้เฉพาะกับ Visual Studio รุ่นที่ใหม่กว่า (2012 หรือใหม่กว่า)


7

วิธีที่ดีกว่าสำหรับฉันคือการใส่องค์ประกอบเฉพาะในกรณีที่มันไม่มีอยู่เนื่องจากฉันตั้งค่าคุณลักษณะบางอย่างเท่านั้น การลบองค์ประกอบจะเป็นการยกเลิกคุณสมบัติอื่น ๆ ขององค์ประกอบหลักหากมีอยู่

ตัวอย่าง: web.config (ไม่มีองค์ประกอบ)

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

web.config (มีองค์ประกอบ)

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

การใช้ตัวระบุตำแหน่งด้วยนิพจน์ XPath ฉันจะเพิ่มโหนดถ้ามันไม่มีอยู่จากนั้นตั้งค่าแอตทริบิวต์ของฉัน:

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

ทั้งไฟล์ web.config ที่เป็นผลลัพธ์มี includeExceptionDetailInFaults = "true" และไฟล์ที่สองเก็บรักษาแอ็ตทริบิวต์ httpsHelpPageEnabled โดยที่เมธอด remove / insert จะไม่


1
ฉันชอบความคิดนี้ แต่ฉันได้รับข้อผิดพลาดหากองค์ประกอบนั้นมีอยู่แล้ว "ไม่มีองค์ประกอบในเอกสารต้นฉบับตรงกับ ... " นั่นคือถ้ามีอยู่ "ไม่" ล้มเหลวดังนั้นจึงเป็นข้อผิดพลาด
goodeye

นี่เป็นเทคนิคที่คุณต้องการเมื่อคุณใช้รุ่นของ XDT ที่ไม่รองรับองค์ประกอบใหม่ (ish) "InsertIfMissing"
IanBru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.