2010-06-21 10 views
6

Mam usługę Windows WCF z punktem końcowym określonym w pliku konfiguracyjnym usługi.Przesłanianie pliku konfiguracyjnego Adresy podstawowe WCF w kodzie

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

Wszystko działa dobrze. Jednak w niektórych przypadkach port 9000 może już być w użyciu, co powoduje, że ServiceHost spada na Open(). Muszę być w stanie PRZESUWAĆ domyślny adres bazowy określony w pliku konfiguracyjnym w kodzie. na przykład załóżmy, że zmienna środowiskowa zawiera numer portu, który ma być użyty.

Czy jest jakiś sposób, aby to zrobić programowo?

Po skonstruowaniu ServiceHost widzę właściwość BaseAddresses, która zwraca listę Uri pobraną z pliku konfiguracyjnego. Jest to jednak kolekcja tylko do odczytu, więc nie można jej użyć do zmiany wartości domyślnych.

Gdybym określić zastępczą Uri w konstruktorze ServiceHost uzyskać

Ta kolekcja zawiera już adres ze schematem Net.TCP. W tym zbiorze może być maksymalnie jeden adres na schemat . Jeśli usługa jest organizowany w IIS można rozwiązać problem ustawiając 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' true lub określając 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'.

Jeśli utworzę CustomServiceHost i spróbuję ustawić zastępczy adres bazowy, otrzymam ten sam błąd.

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

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

wiem, że jeśli wyjadę adresy bazowe plik konfiguracyjny puste i przekazać adres bazowy do konstruktora ServiceHost wtedy, że działa dobrze - to znaczy można określić nowe zasady. Jednak chcę użyć pliku konfiguracyjnego, aby określić domyślny (zamiast twardego kodowania).

Odpowiedz

Powiązane problemy