2009-04-28 4 views
7

J'ai une application Web qui utilise un certain nombre de services WCF. Je déploie mon application web dans différents environnements (dev, UAT, production etc). L'URL de chaque service WCF est différente pour chaque environnement. J'utilise .NET 3.5 et basicHttpBinding sModification de l'URL de référence du service WCF en fonction de l'environnement

L'application Web utilise un cadre pour prendre en charge les paramètres spécifiques à la machine dans mon fichier web.config. Lors de l'instanciation d'une instance d'un client de service WCF j'appelle une fonction qui crée l'instance du client de service WCF en utilisant la surcharge du constructeur qui prend les arguments:

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

En substance, la configuration <system.serviceModel><bindings><basicHttpBinding><binding> dans web.config a été répliquées en code C#

Cette approche fonctionne bien.

Cependant, je dois maintenant améliorer cette approche pour travailler avec un service WCF qui utilise un certificat X509. Cela signifie que je dois répliquer les paramètres suivants dans web.config en code 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> 

J'ai du mal à comprendre comment coder cette configuration en C#.

Deux questions se

  • Quelqu'un peut-il recommander une meilleure approche de la gestion des URL de référence de service WCF sur plusieurs environnements?
  • Vous pouvez également des suggestions sur la façon de reproduire la section web.config ci-dessus en C# seront accueillis
+1

Ajout de quelques réflexions supplémentaires à ma réponse - vous pouvez aller avec des liaisons nommées, etc. de telle manière que vous puissiez déterminer le nom en fonction de votre environnement, puis charger les valeurs appropriées à partir de votre fichier de configuration. –

+0

La question suivante se rapporte à cela http://stackoverflow.com/questions/798684/programmatically-set-identity-on-wcf-endpointaddress –

+0

Je réalise que vous faites ceci dans le code plutôt que dans les fichiers de configuration, mais pourquoi ne pas utiliser la configuration Transformer et placer les paramètres spécifiques à l'environnement dans le fichier de configuration approprié (Web.config.dev, Web.config.Test, Web.config.Release, etc.)? – camainc

Répondre

1

Le code suivant reproduit la configuration de ma question initiale:

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; 

Dans le code de production, les deux valeurs de thumbprint sont stockées dans appSettings dans le fichier web.config.

4

Une approche possible serait de « extérioriser » certaines parties de votre configuration <system.serviceModel> dans des fichiers externes , un par environnement.

E.g. nous avons « bindings.dev.config » et « bindings.test.config », que nous référençons alors dans notre principale web.config comme ceci:

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

De cette façon, tout ce que vous devez changer de DEV PROD est-ce une ligne de config XML.

Fondamentalement, dans .NET 2.0 config, tout élément de configuration peut être "externalisé". Vous ne pouvez cependant pas externaliser directement configGroups (tel que "system.serviceModel") - vous devez être au niveau "élément de configuration".

Marc

EDIT: OK, donc NO change modifier config pour basculer entre les environnements ..... Dans ce cas, vous avez probablement imaginer un schéma de nommage, par exemple nommez vos liaisons, comportements et points de terminaison de telle sorte que vous puissiez les distinguer lors de l'exécution.

Quelque chose comme:

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

cette façon, vous pouvez construire le nom de l'élément que vous voulez (par exemple, la liaison « Default_PROD ») à partir de votre code et l'environnement que vous utilisez dans, puis saisir la config correspondante du fichier de configuration qui contient tous les paramètres de configuration pour tous les environnements.

+0

J'ai vraiment besoin d'une option qui nécessite zéro changement de fichier de configuration entre les environnements ... –

1

Nous n'utilisons pas du tout les fichiers web.config, nous spécifions tout par programme et chargeons toute la configuration à partir d'une base de données centralisée.

+0

Utilisez-vous des services WCF qui nécessitent des certificats X509? –

+1

Désolé, mais nous avons des options et des types de liens différents que nous supportons net.tcp, basicHttp, WS *). En fonction de l'URL, nous recherchons différentes configurations dans la base de données et configurons de manière dynamique selon les besoins. C'est relativement simple et élimine les charges de configuration. Nous pouvons également déployer dans un environnement de ferme Web et lui permettre d'être configuré de manière centralisée. – Bigtoe

+0

Pas de problème - ça sonne comme une bonne approche –

Questions connexes