我有一个使用大量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#编写此配置时遇到一些困难。
两个问题
答案 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
中。