2009-05-07 15 views
10

バインディングやエンドポイント(Visual Studio経由でWCFを登録したときにApp.configの生成された値から読み込みます)を指定せずにサービスを作成すると、正常に動作するWCFサービスがあります。WCF:これらのApp.config値をプログラムで再作成するにはどうすればよいですか?

私は、サービス参照を返す簡単な方法があります(値は設定から​​読み込まれるため)

return new SmsServiceReference.SmsEngineServiceClient(); 

これはうまく動作します。しかし、私は、データベース(例えばURI)で、これらの値のいくつかを持っているしたいと、このような何かをしたいと思います:これは動作しません

 Binding binding = new BasicHttpBinding(); 
     EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

     return new SmsServiceReference.SmsEngineServiceClient(binding,endpointAddress); 

。サービス参照を使用しようとすると例外がスローされます。

これは、私のApp.configには2つの行が提供されていないことが明らかです(明らかに)。問題は、次のApp.Config値をプログラムで複製するにはどうすればいいですか?

私のApp.Configの断片です:(URIはinocentを保護するために変更されています)。

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_ISmsEngineService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://www.myuri.com/Services/Services.svc/basic" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISmsEngineService" 
     contract="SmsServiceReference.ISmsEngineService" name="BasicHttpBinding_ISmsEngineService" /> 
</client> 

答えて

16

アプリケーション設定の値のほとんどは、結合のプロパティであり、プログラム的に再作成することができます。個人的に、私は以下のいずれかが結合

 

public static BasicHttpBinding CreateBasicHttpBinding() 
     { 
      BasicHttpBinding binding = new BasicHttpBinding(); 
      binding.AllowCookies = false; 
      binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
      binding.OpenTimeout = new TimeSpan(0, 1, 0); 
      binding.SendTimeout = new TimeSpan(0, 1, 0); 
      // add more based on config file ... 
      //buffer size 
      binding.MaxBufferSize = 65536; 
      binding.MaxBufferPoolSize = 534288; 
      binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 

      //quotas 
      binding.ReaderQuotas.MaxDepth = 32; 
      binding.ReaderQuotas.MaxStringContentLength = 8192; 
      // add more based on config file ... 

      return binding; 
     } 
 

を作成するなどの方法を使用して、私は自分のエンドポイントアドレスを作成するために、このようなものを使用

 

public static EndpointAddress CreateEndPoint() 
     { 
      return new EndpointAddress(Configuration.GetServiceUri()); 
     } 
 

serviceURIは、サービスのURLになりますようhttp://www.myuri.com/Services/Services.svc/basic最後に、サービスクライアント

 

Binding httpBinding = CreateBasicHttpBinding(); 
EndpointAddress address = CreateEndPoint(); 
var serviceClient = new MyServiceClient(httpBinding, address); 
 
+0

これはトリックでした。ありがとう。 –

1

まあ、configにクライアントエンドポイントは、このURLを指定しています。

<endpoint address="http://www.myuri.com/Services/Services.svc/basic" 

が、あなたのコードサンプルでは、​​あなたが作成します。

EndpointAddress endpointAddress = new EndpointAddress("my.uri.com/service.svc"); 

とアドレスが一致している必要があります - 設定内のコードが動作する場合は、コードを次のように変更する必要があります:

あなたのコードサンプル(my.uri.comとwww.myuri.com、/Services/Services.svcの代わりに/service.svc)にさまざまな小さなタイプミスがあります。

修正されたエンドポイントアドレスでは機能しますか?

マルク・

+0

を作成する

私はFOを謝罪私はちょうど "シンプル"にしようとしていました。コード内(およびアプリケーション設定内)のエンドポイントアドレスの使用は同じですが、動作しません。一つの違いがあります、App.configには/基本的なものがあります。これはURIの一部ではありません.VSTUDIOがそれをなぜ追加したのかはわかりません。そのURLを(/ basicで)参照すると、うまくいきません。言うまでもなく、私は両方を試みました。私はApp.configが持っている私の "エンドポイント"作成に何かがないと思います。実際には、私は私のエンドポイントには何のパラメータも与えていませんが、他のすべてのAPp.config情報はどうでしょうか? –

+0

URLの正確なスペルが重要です。ここでは「シンプル」なので混乱が生じます。サーバー部分の設定ファイルを表示できますか? –

+0

こんにちはマーク、問題はURIではなく、クライアントweb.configで私が持っていたいくつかのパラメータは、プログラムでそれを作成するときにバインディングに渡されていませんでした。私はweb.config(Emmanuelの提案を使用して)と同じようにすべてを渡しました。ご協力いただきありがとうございます! +1あなたのために –

関連する問題