2

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...
4

1 に答える 1

1

多くの実験の後、私はいくつかの進歩を遂げました。プロキシを手動で指定できることが判明し、それは機能します。

WebProxy proxy = new WebProxy("http://x.x.x.x:3128", false);
proxy.Credentials = new NetworkCredential("user", "pass");
WebRequest.DefaultWebProxy = proxy;

このコードは、clientProxy_ をインスタンス化する直前に表示されます。以前にこれを試しましたが、ポートを指定していなかったため、黙って失敗しました。Windows インターネット設定で指定されたプロキシ設定を取得できません。設定proxy.Credentials = CredentialCache.DefaultNetworkCredentials;してみましたが、それも効果がないようでした。

また、ChainTrust を使用してサービスの証明書を検証しようとしているクライアントで問題が発生していますが、チェーンされた証明書の要求ではプロキシ設定が使用されていません。これはより具体的な質問なので、ここに個別に書きました: Certificate validation does not use proxy settings for chaintrust

だから私はまだより多くの助けを望んでいます。

更新: ユーザーがプロキシ設定を指定できるように、アプリケーションにネットワーク構成ダイアログを追加するだけになりました。自動プロキシ設定を正しく機能させることができませんでした。

于 2012-06-08T17:16:27.823 に答える