2010-06-21 32 views
6

Tôi có dịch vụ WCF Windows với điểm cuối được chỉ định trong tệp cấu hình cho dịch vụ.Ghi đè tệp cấu hình WCF Địa chỉ cơ sở trong mã

<baseAddresses> 
    <add baseAddress="net.tcp://localhost:9000/MyEndpoint"/> 
</baseAddresses> 

Mọi công việc đều ổn. Tuy nhiên, trong một số trường hợp, cổng 9000 có thể đã được sử dụng khiến ServiceHost rơi vào Open(). Tôi cần có khả năng TỔNG QUAN địa chỉ cơ sở mặc định được chỉ định trong tệp cấu hình trong mã. ví dụ. giả định một biến môi trường chứa số cổng được sử dụng.

Có cách nào để thực hiện điều này theo chương trình không?

Sau khi ServiceHost được tạo, tôi có thể thấy thuộc tính BaseAddresses trả về danh sách Uri được lấy từ tệp cấu hình. Tuy nhiên, đây là bộ sưu tập chỉ đọc nên không thể sử dụng để thay đổi các giá trị mặc định.

Nếu tôi chỉ định một sự thay thế Uri trong constructor ServiceHost tôi nhận được

Bộ sưu tập này đã có chứa một địa chỉ với chương trình net.tcp. Có có thể có tối đa một địa chỉ cho mỗi lược đồ trong bộ sưu tập này. Nếu dịch vụ của bạn là đang được lưu trữ trong IIS bạn có thể khắc phục vấn đề bằng cách thiết lập 'System.ServiceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' true hoặc chỉ định 'System.ServiceModel/serviceHostingEnvironment/baseAddressPrefixFilters'.

Nếu tôi tạo CustomServiceHost và thử đặt địa chỉ cơ sở thay thế, tôi sẽ gặp lỗi tương tự.

class CustomHost : ServiceHost 
{ 
    public CustomHost(Type serviceType) : base (serviceType)   
    { 
    } 
    protected override void ApplyConfiguration() 
    { 
     base.ApplyConfiguration(); 

     this.AddBaseAddress(new Uri("net.tcp://localhost:9010/MyEndpoint")); 
    } 
} 

Tôi biết rằng nếu tôi để địa chỉ cơ sở tệp cấu hình trống và chuyển địa chỉ cơ sở vào hàm tạo ServiceHost thì hoạt động tốt - tức là tôi có thể chỉ định cơ sở mới. Tuy nhiên, tôi muốn sử dụng tệp cấu hình để chỉ định mặc định (thay vì mã hóa cứng).

Trả lời

Các vấn đề liên quan