web-dev-qa-db-ja.com

コードで、クライアントアプリにWCFエンドポイント構成を作成しますか?

.NETクライアントアプリケーションからWCFWebサービスを利用しようとしています。プログラムでエンドポイントを作成できる必要があると思いますが、その方法がわかりません。アプリケーションを実行しようとすると、次のエラーが発生するため、これを行う必要があると思います。

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

このエラーのトラブルシューティング中に、同じWebサービスを利用しようとする単純なWindowsフォームアプリケーションを作成しました。このテストアプリケーションを使用すると、Webサービスに正常に接続でき、有効な応答が得られます。ただし、system.serviceModelノードとそのすべての子ノードをアプリケーションのapp.configファイルから削除することで、テストアプリ内で上記の正確なエラーを再現できます(そのセクションをすべて削除する必要はないかもしれません。わからない)。そのため、最初に考えたのは、実際のアプリのapp.configファイルにそのセクションを追加する必要があり、すべてが正常である必要があるということでした。残念ながら、私がここに入らないというばかげた理由のために、それはオプションではありません。そのため、クライアントアプリ内で、この情報をコードで生成する必要があります。

ここにいる誰かが私がこれを解決するのを手伝ってくれるか、この種の問題のための良いリソースに私を向けることができることを願っています。

クライアントアプリでコードでエンドポイント構成を作成することは可能ですか?

15
campbelt

デフォルトでは、Add Service Reference操作を実行すると、WCFランタイムがクライアント側プロキシを生成します。

これを使用する最も簡単な方法は、パラメーターを受け取らないコンストラクターを使用してクライアントプロキシをインスタンス化し、app.configから情報を取得することです。

YourServiceClient proxy = new YourServiceClient();

これには、構成ファイルにサービスコントラクトの<client>エントリが必要です。そうでない場合は、エラーが発生します。

ただし、WCFランタイムによって生成されたクライアント側プロキシクラスには、追加のコンストラクターもあります。たとえば、エンドポイントアドレスとバインディングを取得します。

BasicHttpBinding binding = new BasicHttpBinding(SecurityMode.None);
EndpointAddress epa = new EndpointAddress("http://localhost:8282/basic");

YourServiceClient proxy = new YourServiceClient(binding, epa);

この設定では、構成ファイルはまったく必要ありません。すべてをコードで定義します。もちろん、ここでバインディングやエンドポイントの他のプロパティをコードで設定することもできます。

40
marc_s

インターフェイスを定義するアセンブリへの参照がある場合にWCFサービスを利用する最も簡単な方法は、System.ServiceModel.ChannelFactoryクラスを使用することです。

たとえば、BasicHttpBindingを使用する場合:

var emailService = ChannelFactory<IEmailService>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(new Uri("http://some-uri-here.com/));

サービスAssemblyへの参照がない場合は、生成されたプロキシクラスでオーバーロードされたコンストラクターの1つを使用して、バインディング設定を指定できます。

9
eulerfx