2009-04-28 12 views
7

Tengo una aplicación web que utiliza varios Servicios WCF. Implemento mi aplicación web en diversos entornos (desarrollo, UAT, producción, etc.). La URL de cada servicio WCF es diferente para cada entorno. Estoy usando .NET 3.5 y basicHttpBinding sCambio del URL de referencia del servicio WCF según el entorno

La aplicación web utiliza un marco para admitir configuraciones específicas de la máquina en mi archivo web.config. Cuando una instancia de una instancia de un cliente de servicio WCF que llamo una función que crea la instancia del cliente de servicio WCF utilizando la sobrecarga de constructor que toma los argumentos:

System.ServiceModel.Channels.Binding binding, 
System.ServiceModel.EndpointAddress remoteAddress 

En esencia la configuración <system.serviceModel><bindings><basicHttpBinding><binding> en web.config ha sido replicados en el código C#.

Este enfoque funciona bien.

Sin embargo, ahora tengo que mejorar este enfoque para trabajar con un servicio WCF que utiliza un certificado X509. Esto significa que tengo que replicar los siguientes ajustes adicionales en web.config en código C#:

<!-- inside the binding section --> 
<security mode="Message"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" /> 
</security> 


<behaviors> 
    <endpointBehaviors> 
    <behavior name="MyServiceBehaviour"> 
     <clientCredentials> 
     <clientCertificate storeLocation="LocalMachine" storeName="My" 
      x509FindType="FindByThumbprint" findValue="1234abcd" /> 
     <serviceCertificate> 
      <defaultCertificate storeLocation="LocalMachine" storeName="My" 
      x509FindType="FindByThumbprint" findValue="5678efgh" /> 
      <authentication trustedStoreLocation="LocalMachine" 
      certificateValidationMode="None" /> 
     </serviceCertificate> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

estoy teniendo algunas dificultades para encontrar la manera de codificar esta configuración en C#.

Dos preguntas

  • ¿Alguien puede recomendar un mejor enfoque para la gestión de las direcciones URL de referencia de servicio WCF a través de múltiples entornos?
  • Alternativamente, alguna sugerencia sobre cómo reproducir la sección de web.config anterior en C# serán recibidos
+1

Agregué algunos pensamientos adicionales a mi respuesta - podría ir con enlaces con nombre, etc. de tal forma que pueda determinar el nombre basado en su entorno, y luego cargar los valores apropiados de su archivo de configuración. –

+0

La siguiente pregunta se relaciona con este http://stackoverflow.com/questions/798684/programmatically-set-identity-on-wcf-endpointaddress –

+0

Me doy cuenta de que está haciendo esto en código en lugar de en archivos de configuración, pero ¿por qué no usar config transformaciones y colocar la configuración específica del entorno en el archivo de configuración apropiado (Web.config.dev, Web.config.Test, Web.config.Release, etc.)? – camainc

Respuesta

1

El siguiente código se replica la configuración en mi pregunta original:

myClient.ClientCredentials.ClientCertificate.SetCertificate(
    StoreLocation.LocalMachine, 
    StoreName.My, 
    X509FindType.FindByThumbprint, 
    "1234abcd"); 

myClient.ClientCredentials.ServiceCertificate.SetDefaultCertificate(
    StoreLocation.LocalMachine, 
    StoreName.My, 
    X509FindType.FindByThumbprint, 
    "5678efgh"); 

myClient.ClientCredentials.ServiceCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine; 
myClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 

En el código de la producción de los dos valores de huella digital se almacenan en appSettings en el archivo web.config.

4

Una posibilidad sería la de "externalizar" ciertas partes de la configuración <system.serviceModel> en archivos externos , uno por ambiente

E.g. tenemos "bindings.dev.config" y "bindings.test.config", que a continuación hacemos referencia en nuestro web.config principal de la siguiente manera:

<system.serviceModel> 
    <bindings configSource="bindings.dev.config" /> 
</system.serviceModel> 

De esta forma, todo lo que necesita para pasar de DEV a PROD es esta una línea de config XML.

Básicamente, en .NET 2.0 config, cualquier elemento de configuración puede ser "externalizado". Sin embargo, no puede externalizar los grupos de configuración (como "system.serviceModel") directamente, tiene que estar en el nivel de "elemento de configuración".

Marc

EDIT: Ok, así NO config cambios de edición para cambiar entre entornos ..... En ese caso, es probable que tenga a forjarse un esquema de nombres, por ejemplo, nombre sus enlaces, comportamientos y puntos finales de tal manera que pueda distinguirlos en el tiempo de ejecución.

Algo así como:

<bindings> 
    <binding name="Default_DEV"> 
    ..... 
    </binding> 
    <binding name="Default_PROD"> 
    ..... 
    </binding> 
</bindings> 

de esa manera, se podría construir en alto el nombre del elemento que desee (por ejemplo, "Default_PROD" vinculante) de su código y el medio ambiente se está ejecutando, y luego agarrar la configuración de acuerdo del archivo de configuración que contiene todas las configuraciones de configuración para todos los entornos.

+0

Realmente necesito una opción que requiera cero cambios de archivos de configuración entre entornos ... –

1

No utilizamos archivos web.config en absoluto, especificamos todo de forma programática y cargamos toda la configuración desde una base de datos centralizada.

+0

¿Utiliza algún servicio de WCF que requiera certificados X509? –

+1

Lo sentimos, pero tenemos diferentes opciones y tipos de enlaces, admitimos net.tcp, basicHttp, WS *). Dependiendo de la URL, buscamos diferentes configuraciones en la base de datos y configuramos dinámicamente según corresponda. Es relativamente sencillo y elimina una gran cantidad de configuraciones. También podemos implementar en un entorno de granja de servidores web y permitir que se configure de forma centralizada. – Bigtoe

+0

No hay problema - suena como un buen enfoque –

Cuestiones relacionadas