2010-06-21 13 views
6

Tengo un servicio WCF de Windows con un punto final especificado en el archivo de configuración para el servicio.Reemplazando el archivo de configuración WCF Direcciones base en el código

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

Todo funciona bien. Sin embargo, en algunos casos, el puerto 9000 ya podría estar en uso, lo que hace que ServiceHost caiga en Open(). Necesito poder OVERRIDE la dirección base predeterminada especificada en el archivo de configuración en el código. p.ej. Supongamos que una variable de entorno contiene el número de puerto que se utilizará.

¿Hay alguna manera de hacer esto programáticamente?

Después de que se construye el ServiceHost puedo ver la propiedad BaseAddresses que devuelve la lista de Uri tomada del archivo de configuración. Sin embargo, esta es una colección de solo lectura, por lo que no se puede usar para cambiar los valores predeterminados.

Si puedo especificar un reemplazo Uri en el constructor ServiceHost me sale

Esta colección ya contiene una dirección con net.tcp esquema. No puede ser a lo sumo una dirección por esquema en esta colección. Si su servicio es siendo alojado en IIS se puede solucionar el problema mediante el establecimiento de 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' a verdadero o especificando 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'.

Si creo un CustomServiceHost e intento configurar la dirección base de reemplazo, obtengo el mismo error.

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

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

sé que si dejo las direcciones base fichero de configuración en blanco y pase la dirección base en el constructor ServiceHost entonces que funciona bien - es decir, puedo especificar las nuevas bases. Sin embargo, quiero usar el archivo de configuración para especificar el valor predeterminado (en lugar de la codificación dura).

Respuesta

Cuestiones relacionadas