WCF サービスと、そのサービスを使用するクライアントがあります。MTOM メッセージ エンコーディングで WSHttpBinding を使用します。クライアントは app.config ファイルを使用せず、すべてのエンドポイント構成をコードで行います。通常の環境ではすべてうまく機能しますが、http プロキシの背後からサービスに接続しようとしているユーザーがいます。接続しようとするたびに、407 (プロキシ認証が必要です) 警告が表示されます。
プロキシに接続するプライベート ネットワークを備えた仮想マシンを使用して、独自のテスト環境をセットアップすることができたので、彼らが見ているものをシミュレートできます。app.config で system.net useDefaultCredentials プロパティを設定しようとしましたが、効果がないようです。送信されたパケットを調べましたが、Proxy-Authentication ヘッダーは含まれていません。プロキシ経由の Web トラフィックを見ると、そのヘッダーが使用されています。
また、プロキシサーバーをクライアントにハードコーディングしようとしましたが、「サーバーに接続できません」という例外が発生します。パケットを調べると、クライアントは 3 つの小さなパケットをプロキシに送信しますが、いずれも http 要求ではなく、それだけです。そこで何をしているのかわかりません。
クライアントにメッセージインスペクターを追加し、必要なヘッダーを手動でリクエストに挿入することさえしましたが、ヘッダーには表示されません。
私はここでロープの終わりにぶつかっています。本当に解決策が必要です。ここで欠けているもの、または解決策についてのアイデアはありますか?
これ ( wsHttpBinding を使用した WCF サービス - HTTP 要求ヘッダーの操作) は有望に思えますが、まだ行き詰まっています。
編集: コードの一部を次に示します。
var binding = new WSHttpBinding();
binding.MaxReceivedMessageSize = 100000000;
binding.MessageEncoding = WSMessageEncoding.Mtom;
binding.ReaderQuotas.MaxArrayLength = 100000000;
binding.OpenTimeout = new TimeSpan(0, 2, 0);
binding.ReceiveTimeout = new TimeSpan(0, 2, 0);
binding.SendTimeout = new TimeSpan(0, 2, 0);
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.UseDefaultWebProxy = true;
// I've also tried setting this to false, and manually specifying the binding.ProxyAddress
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;
var endpointAddress = new EndpointAddress(new Uri(hostUrl));
clientProxy_ = new UpdaterServiceProxy(binding, endpointAddress);
// this behavior was the attempt to manually add the Proxy-Authentication header
//clientProxy_.Endpoint.Behaviors.Add(new MyEndpointBehavior());
clientProxy_.ClientCredentials.UserName.UserName = userName;
clientProxy_.ClientCredentials.UserName.Password = password;
clientProxy_.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
System.ServiceModel.Security.X509CertificateValidationMode.ChainTrust;
// do stuff...