根据环境更改WCF服务引用URL

时间:2009-04-28 12:06:19

标签: c# .net wcf web-config

我有一个使用大量WCF服务的Web应用程序。我在各种环境(开发,UAT,生产等)中部署我的Web应用程序。每个WCF服务的URL对于每个环境都是不同的。我使用的是.NET 3.5和basicHttpBinding s

Web应用程序使用框架在我的web.config文件中支持特定于计算机的设置。在实例化WCF服务客户端的实例时,我调用一个函数,该函数使用带有参数的构造函数重载来创建WCF服务客户端的实例:

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

实质上,web.config中的<system.serviceModel><bindings><basicHttpBinding><binding>配置已在C#代码中复制。

这种方法效果很好。

但是,我现在必须增强此方法以使用使用X509证书的WCF服务。这意味着我必须在C#代码中的web.config中复制以下附加设置:

<!-- 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>

我在如何使用C#编写此配置时遇到一些困难。

两个问题

  • 任何人都可以推荐更好的方法来管理多个环境中的WCF服务参考URL吗?
  • 或者,欢迎任何有关如何在C#中复制上述web.config部分的建议

3 个答案:

答案 0 :(得分:4)

一种可能的方法是“外化”&lt; system.serviceModel&gt;的某些部分。配置到外部文件,每个环境一个。

E.g。我们有“bindings.dev.config”和“bindings.test.config”,然后我们在主web.config中引用,如下所示:

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

这样,您需要从DEV更改为PROD就是这一行的配置XML。

基本上,在.NET 2.0配置中,任何配置元素都可以“外部化”。但是,您无法直接外部化configGroups(例如“system.serviceModel”) - 您必须处于“配置元素”级别。

马克

编辑:好的,所以配置编辑更改以在环境之间切换..... 在这种情况下,您可能需要设想一个命名方案,例如:以这种方式命名绑定,行为和端点,以便在运行时区分它们。

类似的东西:

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

这样,您可以从您的代码和您正在运行的环境中构建所需元素的名称(例如绑定“Default_PROD”),然后从配置文件中获取相应的配置,其中包含所有所有环境的配置设置。

答案 1 :(得分:1)

我们根本不使用web.config文件,我们以编程方式指定所有内容并从集中式数据库加载所有配置。

答案 2 :(得分:1)

以下代码复制了原始问题中的配置:

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;

在生产代码中,两个指纹值存储在web.config文件中的appSettings中。