WindowsサービスでホストされているWCFサービスがあります。このサービスは、ユーザーのマシンの1つで実行する必要があり、別のマシンにあるクライアントアプリケーションによってアクセスされます。サービスはBasicHttpBindingを介して公開されます。サーバーは.NET 4.0を使用してC#で実装されます。クライアントは.NET 3.5(外部要件)を使用して実装されます。WCF:自己ホストサービスのサービスエンドポイント名の制御
WSDL全体を1つのファイル(複数のXSDではなく)に絞り込むために、サービスのいくつかの調整を行いました。これを行う手順は、例えば以下のように概説される。 here。
Iが「ローカルホスト」エンドポイント、すなわち:
ServiceHost serviceHost = new ServiceHost(serviceInstance, "http://localhost:8080/...");
介してサービスを公開し、そのエンドポイントは上記ベースアドレスに相対URIとして露出しています。
私の問題は、VS2010の「サービスリファレンスの追加」を使用してプロキシを生成すると、デフォルトのctorが「http:// localhost:8080/...」エンドポイントに接続するプロキシを取得することです。これは、サービスがクライアントと同じマシン(たとえばテスト中)でホストされている場合は正常に動作しますが、サーバーとクライアントのマシンが分離していると明らかに失敗します。クライアントマシンには、http:// localhost: 8080/...」と表示されます。
WSDLファイルが含まれています:
<wsdl:service name="MyService">
<wsdl:port name="BasicHttpBinding_IMyService" binding="tns:BasicHttpBinding_IMyService">
<soap:address location="http://localhost:8080/MyService/IMyService" />
確かに、私はに接続するための実際のホスト名を受け取り、異なるのctorを使用することができますが、私は、ホストの実際のアドレスを使用してクライアントを生成したことを考えると、私は一種の期待しますクライアントは自動的にこのエンドポイントに接続します。
いくつかのフォーラムで、サーバー上でlocalhostを使用する代わりに、ホスト名またはIPを使用できることがわかりました。しかし、ホストは複数のホスト名やIPを持つことがあり、サービスはどちらを選択するかを知りません。
「実際の」サーバーのアドレス(プロキシの作成に使用されたWSDLのURLに示されているとおり)を使用する自動生成プロキシを取得する方法はありますか?
私はapp.configで指定することができますが、そのためには公開されるIP /ホスト名を事前に知っておく必要があります。私はそれを知る方法がありません。ホスト名が外部に公開されていない可能性があり、NATを使用してIPを変換できます。 – telewin
通常、WCFを使用する製品を提供する場合、app.configファイルで編集する内容をクライアントに伝えます。この方法では何もハードコードされず、クライアントは公開するアドレスを決めることができます。また、動的な方法がありますので、こちらをご覧ください:http://support.microsoft.com/kb/971842 – fejesjoco
ユーザーが手動で設定するのは良い経験ですか? IPアドレスが変わるとどうなりますか?サービスが壊れて、なぜそれを推測するのは難しいでしょう。クライアントのコードを自動的に変更して、サーバーのアドレスを自動的に抽出し、適切なクライアントctorを使用するようにしたいと思いますが、私は自動的な方法があることを望んでいました。 – telewin