2009-04-28 36 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