2009-04-28 13 views
7

私はいくつかのWCFサービスを使用するWebアプリケーションを持っています。私はさまざまな環境(dev、UAT、productionなど)で私のWebアプリケーションをデプロイします。各WCFサービスのURLは環境ごとに異なります。 .NET 3.5およびbasicHttpBindingを使用しています環境に基づいてWCFサービス参照URLを変更する

Webアプリケーションは、web.configファイルのマシン固有の設定をサポートするフレームワークを使用しています。 web.configファイル内<system.serviceModel><bindings><basicHttpBinding><binding>設定が複製されている。本質的に

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

:WCFサービスクライアントのインスタンスをインスタンス化するとき、私は引数を取るコンストラクタのオーバーロードを使用してWCFサービスクライアントのインスタンスを作成する関数を呼び出します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のセクションを複製する方法上の任意の提案は
+1

あなたの環境に基づいて名前を判断し、設定ファイルから適切な値を読み込むことができるように、名前付きバインディングなどを使うことができます。 –

+0

次の質問は、これに関連しています。http://stackoverflow.com/questions/798684/programmatically-set-identity-on-wcf-endpointaddress –

+0

私はあなたが設定ファイルではなくコードでこれをやっていることを認識していますが、なぜconfig適切な設定ファイル(Web.config.dev、Web.config.Test、Web.config.Releaseなど)に環境固有の設定を置きますか? – camainc

答えて

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; 

2つの拇印値は、web.configファイルにappSettingsに格納されています。

4

一つの可能​​なアプローチは、外部ファイルにあなたの<system.serviceModel>の構成の特定の部分を「外部化」することです歓迎されるだろう、環境ごとに1つ。

など。私たちは、このように私たちの主なweb.configファイルで参照する「bindings.dev.config」と「bindings.test.config」を、持っている:

​​

こうすることで、あなたはPRODにDEVから変更する必要があるすべてconfig XMLのこの1行です。

基本的に、.NET 2.0の設定では、任意の設定要素を「外部化」することができます。ただし、configGroups(「system.serviceModel」など)を直接外部化することはできません。「構成要素」レベルにある必要があります。

マルク・

EDIT:OK、そうNO設定編集の変化が、その場合には環境..... を切り替えるには、あなたはおそらく命名規則を夢見るする必要があり、例えばバインディング、ビヘイビアー、エンドポイントの名前をこのように指定すると、実行時にそれらを区別することができます。

何かのように:

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

そのように、あなたはあなたのコードとあなたが実行している環境から(例えば「Default_PRODを」結合)したい要素の名前を構築し、その後、つかむことができすべての環境のすべての設定を含むconfigファイルの設定に従います。

+0

環境間でゼロ設定ファイルの変更が必要なオプションが本当に必要です... –

1

web.configファイルはまったく使用しません。すべてをプログラムで指定し、すべての設定を集中データベースからロードします。

+0

X509証明書を必要とするWCFサービスを使用していますか? –

+1

申し訳ありませんが、net.tcp、basicHttp、WS *をサポートする様々なオプションとバインドタイプがあります。 URLに応じて、データベース内のさまざまな構成を検索し、必要に応じて動的に構成します。それは比較的単純であり、多くの構成を取り除きます。また、Webファーム環境に展開し、集中的に構成することもできます。 – Bigtoe

+0

問題なし - 良いアプローチのように聞こえる –

関連する問題