3

クライアントアプリケーションで接続しているWCFサービスがあります。設定ファイルで以下を使用しています。

<system.serviceModel>  
    <bindings>  
      <basicHttpBinding>  
        <binding name="MyNameSpace.TestService" closeTimeout="00:01:00" openTimeout="00:01:00"  
            receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"  
            bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"  
            maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"  
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"  
            useDefaultWebProxy="true">  
          <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 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://localhost:9100/TestService" binding="basicHttpBinding"  
          bindingConfiguration="MyNameSpace.TestService" contract="TestService.IService" name="MyNameSpace.TestService" />  
    </client>  
</system.serviceModel>  

コードでは、このサービスで次のようにAPIを呼び出しています。

TestServiceClient client = new TestServiceClient()
client.BlahBlah()

ここで、エンドポイントをポーグラマティックに定義したいと思います。どうすればそれができますか?エンドポイントを動的に追加するには、TestServiceClientインスタンスにコードを配置する必要があると考えていたため、構成ファイルからセクションをコメントアウトしましたが、TestServiceClientがインスタンス化された時点で次の例外がスローされます。

ServiceModelクライアント構成セクションでコントラクト'TestService.IService'を参照するデフォルトのエンドポイント要素が見つかりませんでした。これは、アプリケーションの構成ファイルが見つからなかったか、このコントラクトに一致するエンドポイント要素がクライアント要素で見つからなかったことが原因である可能性があります。

どうすればこれを達成できますか?また、エンドポイントをプログラムで追加するためのコード例に関するポイントもありがたいです。

4

3 に答える 3

9

プログラムでエンドポイントとバインディングを作成するには、サービスでこれを行うことができます。

ServiceHost _host = new ServiceHost(typeof(TestService), null);

var _basicHttpBinding = new System.ServiceModel.basicHttpBinding();
            //Modify your bindings settings if you wish, for example timeout values
            _basicHttpBinding.OpenTimeout = new TimeSpan(4, 0, 0);
            _basicHttpBinding.CloseTimeout = new TimeSpan(4, 0, 0);
            _host.AddServiceEndpoint(_basicHttpBinding, "http://192.168.1.51/TestService.svc");
            _host.Open();

また、サービス構成で複数のエンドポイントを定義し、実行時に動的に接続するエンドポイントを選択することもできます。

クライアントプログラムでは、次のようにします。

basicHttpBinding _binding = new basicHttpBinding();
EndpointAddress _endpoint = new EndpointAddress(new Uri("http://192.168.1.51/TestService.svc"));

TestServiceClient _client = new TestServiceClient(_binding, _endpoint);
_client.BlahBlah();
于 2012-07-20T17:27:55.167 に答える
1

あなたはただ使うことができます:

TestServiceClient client = new TestServiceClient();
client.Endpoint.Address = new EndPointAddress("http://someurl");
client.BlahBlah();

構成ファイルでそのエンドポイント構成を使用していないため、バインディング構成は適用されなくなることに注意してください。あなたもそれを上書きする必要があります。

于 2012-07-20T17:17:16.610 に答える
0

あなたが試すことができます:

TestServiceClient client = new TestServiceClient("MyNameSpace.TestService")
client.BlahBlah()

そうでない場合は、ファイルTestServiceの名前空間が正しいかどうかを再確認しますか?

于 2012-07-20T17:09:25.290 に答える