50

デフォルトのプロキシを使用せずに、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 プロパティを設定して、アプリケーション内で使用する既定の Web プロキシを指定することもできます。

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

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

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

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

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

関連:
-生成された wcf クライアントに認証情報を設定する方法

4

5 に答える 5

65

すべての 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");
于 2009-06-10T12:37:36.563 に答える
27

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

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

于 2009-06-05T03:11:47.713 に答える
22

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

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

大規模なグーグル検索の結果、WebRequest.DefaultProxy (静的プロパティ) を介してプロキシを変更できることがわかりました。

例えば:

WebProxy proxy = new WebProxy("http://myproxyserver",true);
proxy.Credentials = new NetworkCredential("username", "password");
WebRequest.DefaultWebProxy = proxy;
于 2009-06-26T07:57:45.380 に答える
4

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

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

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

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

于 2010-11-29T09:59:07.237 に答える