2009-04-14 13 views
4

私は現在、いくつかのプロジェクトで解決策を持っており、そのうちの1つはWCFサービスです。C#WCF:サービスへのアクセスを提供する共有ライブラリに1つのapp.configを持っています

public static class WSGateway 
{ 
    public static DBInteractionGatewayClient MR_WebService 
    { 
     get 
     { 
      return new DBInteractionGatewayClient(); 
     } 
    } 
} 

私はその意志単一app.configファイルを使用することができること(またはそう思った)ので、これは:私は基本的に、このようなのようなWCFクライアントのインスタンスへのゲートウェイを提供する静的クラスで投影別の作成しましたそのライブラリ内にいるだけで、他のプロジェクトはそれを参照し、そのプロパティからそのクライアントへの参照を取得できます。

しかし、問題は、プロジェクトがそのプロパティにアクセスしようとしたとき、例外は私がアプリケーションにapp.configに必要な、と私は、アプリケーションに私のゲートウェイライブラリapp.configをコピーするとき、それが動作することを私に言って投げているということです。


アプリケーションで複数app.configのファイルを持つと、おそらく単一のライブラリにちょうど1つを有する回避する方法はありますか?


[更新]ソリューション:Anderson Imes "の提案に続き

は、今の私は、クラス内のクライアントの参照設定をハードコーディングすることを決定したため、複数のapp.configのための必要性を排除しました。これに

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_IDBInteractionGateway" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="6000000" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <security mode="None"/> 
        <readerQuotas maxDepth="6000000" maxStringContentLength="6000000" maxArrayLength="6000000" 
         maxBytesPerRead="6000000" maxNameTableCharCount="6000000" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://agnt666laptop:28666/DBInteractionGateway.svc" 
       binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDBInteractionGateway" 
       contract="DBInteraction_Service.IDBInteractionGateway" name="WSHttpBinding_IDBInteractionGateway"> 
       <identity> 
        <dns value="localhost" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

static class):

したがって、私はこのことから私の設定(app.config)を翻訳し

public static class WSGateway 
{ 
    private static WSHttpBinding binding; 
    private static EndpointAddress endpointAddress; 

    static WSGateway() 
    { 
     var readerQuotas = new XmlDictionaryReaderQuotas() 
     { 
      MaxDepth = 6000000, 
      MaxStringContentLength = 6000000, 
      MaxArrayLength = 6000000, 
      MaxBytesPerRead = 6000000, 
      MaxNameTableCharCount = 6000000 
     }; 
     binding = new WSHttpBinding(SecurityMode.None) {MaxReceivedMessageSize = 6000000, ReaderQuotas = readerQuotas}; 

     endpointAddress = new EndpointAddress("http://agnt666laptop:28666/DBInteractionGateway.svc"); 
    } 
    public static DBInteractionGatewayClient MR_WebService 
    { 
     get 
     { 
      return new DBInteractionGatewayClient(binding, endpointAddress); 
     } 
    } 
    public static void ExecuteCommand(Action<DBInteractionGatewayClient> command) 
    { 
     var ws = MR_WebService; 
     command.Invoke(ws); 
     ws.Close(); 
    } 
} 
+2

解決策を投稿していただきありがとうございます...この決定を下すことを試みている他の人に役立つでしょう。 –

+0

ヒントをありがとう。あなたの例は切り捨てられているので、私は以下の私のソリューションを貼り付けました(http://stackoverflow.com/questions/746107/c-wcf-having-a-single-app-config-in-a-shared-library-that-provides- access-to-th/7652518#7652518) –

+0

コードが切り詰められている理由がわかりません。とにかく、ここにそれはどのように見えるべきですか:http://pastebin.com/8jii24JV –

答えて

3

あなたがそのエラーを取得する理由は、そのためのデフォルトコンストラクタWCFクライアントプロキシは、ローカル構成からチャネル構成を検索します。この動作を無効にするには、使用する/接続するバインディングとアドレスを指定します。

ここにはいくつかのオプションがあり、それぞれに異なる展開モデルがあります。

  1. 「ゲートウェイ」ライブラリのエンドポイント情報をハードコードします(これは一般的な用語で「プロキシ」です)。新しいDBInteractionGatewayClient(バインディング、アドレス)を返すだけです。このソリューションでは、WSGatewayコードが含まれていたアセンブリのみを配布します(以下、WSGatewayアセンブリと呼びます)。
  2. すべてのサイトがアクセスできる共通の構成ファイルを作成します。可能なWCF構成の全範囲を利用できるようにするには、ConfigurationManager.OpenMappedExeConfigurationメソッドを使用して手動で読み込む必要があります。
  3. 設定を、データベースなどのすべてのアプリケーションからアクセス可能な共通のリソースに移動します。これは、クライアントのチャネルを開く前に手動でバインディングに適用します。これにより、あなたはこの共同体にアクセスできますソリューションの任意のポイントからデータを設定します。このソリューションでは、ソリューション内のすべてのポイントから構成データベースにアクセスでき、WSGatewayアセンブリを配布することができます。

これは私の頭の上から考えられる解決策です。あなたがすることを決断したことをお知らせください。

+0

ヘルプメイトに感謝します。 –

0

Andreasの答えは "p"で終わるので、何かがコピーを取得せず正しく貼り付けられたと思います。しかしそれは私を正しい軌道に乗せ、私はこれを思いついた。私はMS(電卓)からのWCFの紹介から始めました。

これは、クライアントアプリケーション

 CalculatorClient client = new CalculatorClient(); 

これはapp.configをする必要はありません、ハードコードバージョンであるにapp.configを使用して、古い方法があります。私は、バインディングセクションのapp.config内のすべての値がデフォルトであり、明示的にコピーする必要はないことを再度確認しました。ただし、これらの値をすべてbindingのプロパティに直接追加できます。

 string address = "http://localhost:8000/ServiceModelSamples/Service/CalculatorService"; 
     WSHttpBinding binding = new WSHttpBinding(); 
     binding.Name = "WSHttpBinding_ICalculator"; // not sure if this is necessary. 
     EndpointAddress endpointAddress = new EndpointAddress(address); 
     CalculatorClient client = new CalculatorClient(binding, endpointAddress); 
     return client; 

はところで、私はこれらすべてのバインディングをやっている何見当がつかない、私はちょうどそれが動作するように取得しようとしています!私は昨日WCFについて学んだだけです...私はDLL全体の中にインターフェイス全体を置きたいと思っていましたし、app.configをGUIのフロントエンドでコピーまたはマージする必要はありませんでした。

+0

ええと、理由はわかりませんが、最後のコードスニペットが適切に表示されていませんが、完全なコードが回答に含まれています。私はそれについて司会者に知らせました。それまでの最後のスニペットは次のとおりです。http://pastebin.com/8jii24JV –

関連する問題