2009-04-28 70 views
7

我有一个使用多个WCF服务的Web应用程序。我在各种环境(dev,UAT,production等)中部署我的web应用程序。每个WCF服务的URL对于每个环境都是不同的。我正在使用.NET 3.5和basicHttpBinding s根据环境更改WCF服务参考URL

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服务参考网址更好的方法?
  • 另外,关于如何复制C#中的上述web.config部分,任何建议将受到欢迎
+1

为我的答案增加了一些额外的想法 - 您可以使用命名绑定等方式,以便您可以根据您的环境确定名称,然后从配置文件中加载适当的值。 – 2009-04-28 15:33:28

+0

下面的问题涉及到这个http://stackoverflow.com/questions/798684/programmatically-set-identity-on-wcf-endpoint地址 – 2009-04-30 09:20:32

+0

我意识到你在代码而不是在配置文件中这样做,但为什么不使用配置转换并将环境特定设置放置在适当的配置文件(Web.config.dev,Web.config.Test,Web.config.Release等)中? – camainc 2010-10-28 16:37:05

回答

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; 

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

4

一个可能的办法是“外部化”的<system.serviceModel>配置的某些部分到外部文件中,每个环境一个。

例如我们有“bindings.dev.config”和“bindings.test.config”,这是我们那么在我们主要的web.config中引用这样的:

​​

这样一来,所有你需要从DEV更改为PROD这是配置XML的一行。

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

马克

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

喜欢的东西:

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

这种方式,你可以建立起来的元素的名称你想从你的代码和你在运行的环境(例如结合“Default_PROD”),然后抢配置文件中的相应配置,其中包含所有环境的所有配置设置。

+0

我确实需要一个选项,要求在环境之间更改零配置文件更改... – 2009-04-28 12:50:06

1

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

+0

您是否使用任何需要X509证书的WCF服务? – 2009-04-28 13:30:51

+1

对不起,但我们确实有不同的选项和类型的绑定,我们支持net.tcp,basicHttp,WS *)。根据URL,我们会在数据库中查找不同的配置并根据需要进行动态配置。这是相对直接的,并消除了大量的配置。我们也可以部署到Web场环境并允许它集中配置。 – Bigtoe 2009-04-28 14:08:49

+0

没问题 - 听起来很不错 – 2009-04-28 14:11:17