web-dev-qa-db-ja.com

WCFクライアント側サービスプロキシにHTTPプロキシ(WebProxy)を設定するにはどうすればよいですか?

デフォルトのプロキシを使用せずに、WCFクライアント上でHTTPプロキシをプログラムで設定するにはどうすればよいですか?

プロキシ、プロキシ、プロキシ。

開発のWCFモデルによると、サービスのWSDLでsvcutil.exeを実行して、クライアント側の「プロキシ」クラスを生成します。 (これにより、クライアント側の構成ファイルも生成されます)。

私のコードでは、そのクラスのインスタンスを更新し、サービスに接続できます。非常に素晴らしい。

var svcProxy = new MyWebService();
svcProxy.GetInformation(request); 

これをプロキシクラスと呼びますが、別のプロキシ-httpプロキシがあります。このサービスはwsHttpBinding basicHttpBindingを使用しているため、httpを介しています。ここで、httpプロキシ(.NET BCLのSystem.Net.WebProxyによってモデル化)を介してクライアントをWebサービスに接続したいとします。 .NETとWCFのドキュメントを読んで、広範で楽しい経験から、特に指示がない限り、WCFランタイムはhttp/httpsで通信するときにデフォルトのシステムプロキシを使用することを知っています。

これは、WinXP/2003のコマンドラインから設定できます ここで説明するProxyCfg.exeを使用 、およびWindowsの以降のバージョンで ここで説明するnetsh.exeを使用

System.Net.WebRequest.DefaultWebProxy property を設定して、アプリケーション内で使用するデフォルトのWebプロキシを指定することもできます。

しかし、システム全体のプロキシとは異なるプロキシを介して接続したいとしますか?たとえば、システム全体のプロキシはないかもしれませんが、特にWebサービスにはプロキシを使用する必要があります。または、システム全体のプロキシがあるかもしれませんが、Webサービス用に別のプロキシを使用する必要があります。実際、複数のWebサービスクライアントがあり、それぞれが異なるプロキシを取得する必要があります。

バインディングごとにプロキシを設定するにはどうすればよいですか?

ASMXモデルでは、次のことができます。

var svcProxy = new MyWebService();
svcProxy.Proxy = new System.Net.WebProxy("http://proxyserver:1234", true);
svcProxy.GetInformation(request); 

しかし、これはWCFでは不可能です。 WCFで生成されたクライアント側プロキシクラスは、プロキシプロパティを公開しません。クライアント側プロキシごとにhttpプロキシを設定するにはどうすればよいですか。また、httpプロキシにも認証を設定するにはどうすればよいですか?

関連:
- how-to-set-proxy-with-credentials-to-generated-wcf-client

45
Cheeso

プロキシ設定はバインディング構成の一部です。たとえば、 BasicHTTPBinding および WSHttpBinding クラス/構成要素の ProxyAddress プロパティを見てください。

App.configファイルにエンドポイント構成を残しているように見えますが、その場合はそこにアドレスを設定できるはずです。

25
tomasr

すべてのWCFプロキシが通信にHTTPを使用するわけではないため、WCFプロキシにProxyプロパティがないことは理にかなっています。さらに検討した結果、WCFプロキシがHTTPバインディングを使用している場合、プログラムでWCFにプロキシを設定できることがわかりました。他の誰かがそれを必要とする場合のために、私はここでそれを文書化しています。 WCFクライアントのコードでHTTPプロキシを設定するには、次の操作を行います。

// instantiate a proxy for the service
var svc= new ServiceClient();
// get the HTTP binding
var b = svc.Endpoint.Binding as System.ServiceModel.BasicHttpBinding;
b.ProxyAddress = new Uri("http://127.0.0.1:8888");
b.BypassProxyOnLocal = false;
b.UseDefaultWebProxy = false;

そして、コードでエンドポイントアドレス(サーバーにアクセスする場所)を設定するには、次のようにします。

var e = svc.Endpoint;
e.Address = new System.ServiceModel.EndpointAddress(
    "http://remoteserver:5555/WcfXmlElement");
53
Cheeso

同様の問題が発生しましたが、サービスへのアクセスに使用されるユーザー名とパスワードとは異なるユーザー名とパスワードをプロキシに使用する必要もありました。

UriBuilderを使用してビルドし、プロキシアドレスを「 http:// username:password @ myproxyserver / 」として出力しました。残念ながら、私が使用していた特定のプロキシは、この手法では機能しませんでした。

広範囲にわたるグーグルの後に私が見つけたのは、WebRequest.DefaultProxy(静的プロパティ)を介してプロキシを変更できるということです。

例えば:

WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;
21
Martin Clarke

これを試すこともできます:

使用しているバインディングをプログラムで取得してから、プロキシを直接設定します。

var binding = new WSDualHttpBinding("WSDualHttpBinding_IMainService");
binding.ProxyAddress = new Uri("http://192.168.5.1:3128");

ここで、"WSDualHttpBinding_IMainService"は、構成ファイルからのバインディングの名前です。また、UseDefaultWebProxy=falseを設定する必要があります。それ以外の場合、プロキシは無視されます。

3
Layinka