Có cách nào để thực hiện một Thay thế hoặc Chèn chèn bằng cách sử dụng chuyển đổi web.config không?


183

Tôi đang sử dụng chuyển đổi web.config như được mô tả trong bài viết dưới đây để tạo cấu hình cho các môi trường khác nhau.

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

Tôi có thể thực hiện chuyển đổi "Thay thế" bằng cách khớp trên khóa, ví dụ:

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

Và tôi có thể làm "Chèn", vd

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

Nhưng những gì tôi thực sự thấy hữu ích là một phép chuyển đổi Thay thế, vì tôi không thể luôn dựa vào tệp cấu hình gốc có / không có một khóa nhất định.

Có cách nào để làm điều này?


liên kết bạn cung cấp không hoạt động như bây giờ. Bạn có bất kỳ liên kết khác để hiểu khái niệm dễ dàng?
Ashish-BeJovial

@AshishJain liên kết hoạt động tốt với tôi
Chris Haines

Câu trả lời:


105

Tôi tìm thấy một cách giải quyết giá rẻ. Nó không đẹp và sẽ không hoạt động tốt nếu bạn có nhiều yếu tố cần phải là "Thay thế hoặc Chèn".

Thực hiện "Xóa" và sau đó là "ChènAfter | insertB Before".

Ví dụ,

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

17
Nếu sử dụng VS2012, bây giờ có một giải pháp tốt hơn. Xem bên dưới stackoverflow.com/a/16679201/32055
Chris Haines

1
sẽ "Chèn IfMissing" Chèn và Thay thế nếu cần?
Jessy

Tôi thích tùy chọn này hơn tùy chọn khác nhờ vào việc sử dụng ChènAfter. Chèn IfMissing sẽ vô nghĩa nếu bạn đang thực hiện Xóa.
Shane Courtrille

125

Kết hợp với xdt:Transform="Remove"việc sử dụng xdt:Transform="InsertIfMissing"trong VS2012.

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

Hoàn hảo! Đây là những gì chúng tôi đã chờ đợi.
Chris Haines

9
Điều này không làm như yêu cầu của OP, tất cả.
BradLaney

2
Câu trả lời đã được chỉnh sửa để thể hiện rõ hơn cách nó trả lời câu hỏi ban đầu.
Bon

25
Tôi không hiểu Nếu bạn loại bỏ nó, tất nhiên nó sẽ bị mất, nó chỉ là một Chèn tại thời điểm đó, phải không?
Chad Schouggins

6
@ChadSchouggins không nhất thiết: Removetác vụ chỉ xóa lần xuất hiện đầu tiên. Một số yếu tố có thể có nhiều lần xuất hiện. Tôi không thể tưởng tượng rằng bạn sẽ muốn điều này, nhưng sau đó nó sẽ loại bỏ sự xuất hiện đầu tiên và bỏ qua InsertIfMissingnhiệm vụ. Nhưng bạn sẽ đúng nếu anh ta sử dụng RemoveAllthay thế.
Steven Liekens 10/07/2015

89

Sử dụng InsertIfMissingchuyển đổi để đảm bảo rằng ứng dụng tồn tại.
Sau đó sử dụng Replacebiến đổi để đặt giá trị của 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>

Bạn cũng có thể sử dụng SetAttributeschuyển đổi thay vì Replace. Sự khác biệt là SetAttributeskhông chạm vào các nút con.

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

Các kỹ thuật này tốt hơn nhiều so với remove + insert vì các nút hiện tại không được di chuyển xuống dưới cùng của nút cha. Các nút mới được nối vào cuối. Các nút hiện tại giữ nguyên vị trí của chúng trong tệp nguồn.

Câu trả lời này chỉ áp dụng cho các phiên bản mới hơn của Visual Studio (2012 hoặc mới hơn).


7

Một phương pháp tốt hơn đối với tôi là chỉ chèn phần tử nếu nó không tồn tại vì tôi chỉ đặt một số thuộc tính nhất định. Loại bỏ phần tử sẽ loại bỏ bất kỳ thuộc tính nào khác của phần tử chính nếu chúng tồn tại.

ví dụ: web.config (không có phần tử)

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

web.config (có yếu tố)

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

Sử dụng Trình định vị với biểu thức XPath, tôi thêm nút nếu nó không tồn tại và sau đó đặt thuộc tính của tôi:

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

cả hai tệp web.config kết quả đều có tệpExceptionDetailInFaults = "true" và tệp thứ hai bảo tồn thuộc tính httpsHelpPageEnables trong đó phương thức remove / insert sẽ không.


1
Tôi thích ý tưởng này, nhưng tôi gặp lỗi nếu phần tử đã tồn tại "Không có phần tử nào trong tài liệu nguồn khớp với ...". Đó là, nếu nó tồn tại, "không" là thất bại, vì vậy đó là một lỗi.
tạm biệt

Đây là kỹ thuật bạn cần khi bạn đang sử dụng các phiên bản XDT không hỗ trợ phần tử "Chèn IfMissing" mới (ish).
IanBru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.