2012-03-15 6 views
6

Chúng tôi đã có một chút sự cố hôm nay khiến tôi suy nghĩ. Chúng tôi có một dự án với thiết lập chuyển đổi web.config khá chuẩn cho các cấu hình khác nhau của chúng tôi. Có một phần kiểm soát quyền truy cập vào các dịch vụ DAO của chúng tôi mà trông như thế này:Không thay đổi web.config khi không có giá trị nào tồn tại cho một biến đổi

<endpoint address="http://myserver/myservice1.svc/basicHttp" 
binding="basicHttpBinding" contract="MyAssembly.IItem" name="DataAccessEndPoint" 
kind="" endpointConfiguration="" /> 
<endpoint address="http://myserver/myservice2.svc/basicHttp" 
binding="basicHttpBinding" contract="MyAssembly.IItem2" name="LoggingEndPoint" 
kind="" endpointConfiguration="" /> 

Và một biến đổi như thế này:

<endpoint address="http://mytestserver/myservice1.svc" name="DaoEndPoint" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> 
<endpoint address="http://mytestserver/myservice2.svc" name="LoggingEndPoint" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> 

Hy vọng rằng bạn sẽ phát hiện lỗi ở đây - tên cho DaoEndPoint không khớp. Thật không may, người sáng tạo đã không tạo ra nó và cũng đã được gỡ lỗi cục bộ dựa trên các dịch vụ trực tiếp, điều này đã gây ra việc triển khai thử nghiệm, yup, trỏ đến sống. Chúng tôi may mắn nhặt nó lên khá nhanh, nhưng tôi chắc rằng bạn có thể thấy tiềm năng đau đớn cực độ ở đây!

Tôi đã suy nghĩ về ý định của bạn khi tạo các tệp biến đổi và dường như với tôi rằng nếu bạn đặt một biến đổi mà bạn định chuyển đổi một cái gì đó. Vì vậy, nó sẽ được tốt đẹp nếu biến đổi (và do đó triển khai) thất bại nếu có một DaoEndPoint biến đổi nhưng không phù hợp với mục DaoEndPoint trong tập tin .config chính.

Vì vậy, tôi sắp xếp sắp xếp cho ý kiến ​​của mọi người, đây có phải là thứ hữu ích không? Có đồng bằng quá mức không? Tôi hoàn toàn mất tích điểm?

Ngoài ra, có bất kỳ điều gì ngoài đó thực hiện việc này không? Tôi rất vui khi được khai thác và phát triển một giải pháp, nhưng tôi sẽ hạnh phúc hơn nếu ai đó đã thực hiện công việc chân tay cho tôi;)

+0

Không biết bất kỳ điều gì sẽ gây ra ngoại lệ, mặc dù có thể hữu ích. Có thể muốn chỉ cần cố gắng để trống giá trị trong web.config chính và nếu nó không được chuyển đổi, bạn sẽ nhanh chóng gặp lỗi trong ứng dụng. Không hữu ích, nhưng ngăn chặn mọi truy cập PROD không chủ ý. – dbugger

+0

Vấn đề với điều này là bạn sau đó không thể gỡ lỗi cục bộ mà không thêm vào một giá trị, điều này đưa chúng ta trở lại vấn đề ban đầu khi dev quên lấy giá trị đó ra một lần nữa ... –

Trả lời

1

Xem câu trả lời tuyệt vời của Ibrahim Hashimi là this question, bao gồm việc tạo một lớp tùy chỉnh kế thừa từ Microsoft.Web.Publishing.Tasks.Transform. Bạn có thể sử dụng cùng một kỹ thuật nhưng kế thừa từ lớp Locator thay vào đó, và sau đó ném một ngoại lệ khi bạn không thể khớp với nút đích.

Tôi thực sự đã tự mình thử nghiệm và có thể loại bỏ ngoại lệ trong khi xuất bản. Tuy nhiên, lớp định vị tùy chỉnh của tôi (MyMatch) đã không thực sự làm bất cứ điều gì ngoài việc ném ngoại lệ. Nó có thể là một chút công bằng để ghi đè lên các phương thức để bắt chước lớp Match (mà bạn không thể kế thừa từ đó) và sau đó tìm ra nơi thích hợp để thực hiện kiểm tra cuối cùng cho một lỗi không khớp.

Dù sao, tôi chắc chắn sẽ hữu ích khi ít nhất có tùy chọn mà bạn có thể đặt nơi xuất bản sẽ không thành công hoặc cảnh báo khi biến đổi của bạn không có hiệu lực.

+0

Brill, đây chỉ là loại điều tôi đang tìm kiếm, tôi sẽ cố gắng và kết hợp một số thứ và đăng trên github trong vài tuần tới. (Xin lỗi vì trả lời trễ bằng cách này, trong kỳ nghỉ không có internet!) –