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

StackOverflow https://stackoverflow.com/questions/951523

  •  11-09-2019
  •  | 
  •  

質問

既定のプロキシを使用せずに、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 を使用して.

また、アプリケーション内で使用する既定の Web プロキシを指定することもできます を設定することで、 System.Net.WebRequest.DefaultWebProxy プロパティ.

しかし、 システム全体のプロキシ?たとえば、システム全体のプロキシがないかもしれませんが、 特に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 クライアントに資格情報を使用してプロキシを設定する方法

役に立ちましたか?

解決

プロキシ設定はバインド構成の一部です。たとえば、次を見てください。 プロキシアドレス の財産 基本HTTPバインディング そして WSHttpバインディング クラス/構成要素。

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

他のヒント

いないすべてのWCFプロキシが通信にHTTPを使用しているため、

これは、WCFプロキシには、プロキシプロパティが存在しないことを意味します。さらに検討した後、私は、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");

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

//ユーザ名:

私は、UriBuilderを通してそれをどの出力のhttp」などのプロキシアドレスしまう構築しようとしたパスワードを@ myproxyserver / に」。残念ながら、私が使っていた特定のプロキシは、この技術では動作しませんでした。

私は大規模なグーグル後に発見された何を、あなたはWebRequest.DefaultProxy(静的プロパティ)を介してプロキシを変更することができるということです。

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

また、これを試すことができます:

プログラムを使用している結合どんな取得し、その後、例えば、直接その上でプロキシを設定します。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top