Giới thiệu về configSource
Trong file web.config, bạn có thể sử dụng thuộc tính configSource để tách một phần cấu hình ra thành file riêng:
<myconfig configSource="path\\xxx.config" />
Trong file path\\xxx.config tương ứng, bạn định nghĩa cấu hình như sau:
<myconfig>
<mmm> dd </mmm>
</myconfig>
Lưu ý quan trọng: Đường dẫn trong configSource chỉ có thể là đường dẫn vật lý tương đối (sử dụng dấu \\ ngược), không thể sử dụng dấu / xuôi.
Điểm lợi ích đáng chú ý: Khi website đang chạy, việc sửa đổi file Web.Config sẽ gây ra việc khởi động lại (restart) website, trong khi việc sửa đổi file xxx.Config sẽ không gây ra hiện tượng này.
Ứng dụng trong dự án lớn
Trong các dự án quy mô lớn với nhiều dịch vụ (Service), số lượng cấu hình có thể rất lớn. Nếu để các cấu hình này phân tán trong từng file web.config của các dự án, việc bảo trì sẽ trở nên rất phức tạp. Giải pháp sử dụng configSource giúp tách các file cấu hình riêng biệt và tổ chức chúng một cách module hóa.
Để tránh việc phải sao chép (copy) các file cấu hình này đến nhiều nơi, một phương pháp hiệu quả là sử dụng thư mục cấu hình chung. Tạo một thư mục ảo trong mỗi dự án trỏ đến thư mục chung này (sử dụng Junction Point). Khi đó, chỉ cần thay đổi nội dung trong thư mục chung là tất cả các dự án sẽ được cập nhật.
Ví dụ thực tế
Dưới đây là ví dụ về cách sử dụng configSource cho các phần khác nhau trong file cấu hình:
<appSettings configSource="VConfigs\DEV\appSettings.config" />
<system.serviceModel>
<services configSource="VConfigs\DEV\WCF.services.config" />
<bindings configSource="VConfigs\DEV\WCF.bindings.config" />
<behaviors configSource="VConfigs\DEV\WCF.behaviors.config" />
<client configSource="VConfigs\DEV\WCF.client.config" />
</system.serviceModel>
Thuộc tính configSource trong section system.serviceModel
Thuộc tính configSource được giới thiệu trong .NET framework 2.0 để hỗ trợ các file cấu hình bên ngoài. Thuộc tính này có thể được thêm vào bất kỳ section cấu hình nào để chỉ định một file bên ngoài cho section đó. Việc sử dụng nguồn cấu hình bên ngoài hữu ích trong nhiều tình huống, chẳng hạn khi bạn cần phương pháp dễ dàng để thay đổi cài đặt cho section tùy thuộc vào môi trường (development, test, hoặc production), hoặc khi bạn cần kiểm soát quyền chi tiết.
Điều cần lưu ý là section group system.serviceModel không hỗ trợ trực tiếp thuộc tính này. Nếu bạn cố gắng thêm nó, bạn sẽ nhận được ngoại lệ sau:
Thuộc tính 'configSource' không thể được chỉ định vì tên của nó bắt đầu bằng tiền tố được đặt trước 'config' hoặc 'lock'
Tuy nhiên, bạn có thể sử dụng thuộc tính này cho các section khác nhau bên dưới system.serviceModel như services, behaviors hoặc bindings.
Ví dụ cấu hình
File cấu hình chính có thể trông như thế này:
<configuration>
<system.serviceModel>
<services configSource="Services.config" />
<bindings configSource="Bindings.config" />
<behaviors configSource="Behaviors.config" />
</system.serviceModel>
</configuration>
Mỗi file sẽ chứa section tương ứng:
File Services.config
<services>
<service name="MyCompany.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/myservice/service"/>
</baseAddresses>
</host>
<endpoint address="net.tcp://localhost:9000/myservice/service"
binding="netTcpBinding"
bindingConfiguration="TcpBinding"
contract="MyCompany.ICalculator" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
File Bindings.config
<bindings>
<netTcpBinding>
<binding name="TcpBinding"
closeTimeout="00:01:00"
openTimeout="00:01:00"
receiveTimeout="00:10:00"
sendTimeout="00:01:00">
<readerQuotas maxDepth="32"
maxStringContentLength="8192"
maxArrayLength="16384" />
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
File Behaviors.config
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>