web-dev-qa-db-ja.com

Webサービスを呼び出すときのHTTP407プロキシ認証エラー

私はインターネット経由でサードパーティのWebサービスを呼び出す.NETアプリに取り組んでいます。サービスはSOAPを使用しないため、XML要求ドキュメントを手動で作成し、HTTP経由でサービスに送信して、XML応答を取得します。

私たちのコードは、通常のWindowsドメインアカウントのコンテキストで実行されるWindowsサービスであり、NTLM認証を要求するように構成されたプロキシサーバー(Microsoft ISA Server))の背後にあります。サービスを実行するアカウントプロキシサーバーを介してインターネットにアクセスする権限があります。

コードは次のようになります。

// Create the request object.
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.Method = "POST";

// Configure for authenticating proxy server requiring Windows domain credentials.
request.Proxy = New WebProxy(proxyAddress) { UseDefaultCredentials = true };

// Set other required headers.
request.Accept = acceptableMimeType;
request.Headers.Add(HttpRequestHeader.AcceptCharset, acceptableCharset);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "none");
request.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-gb");
request.Headers.Add(HttpRequestHeader.CacheControl, "no-store");
request.Headers.Add(HttpRequestHeader.ContentEncoding, "none");
request.Headers.Add(HttpRequestHeader.ContentLanguage, "en-gb");
request.ContentType = requestMimeType;
request.ContentLength = requestBytes.Length;

// Make the method call.
using(Stream stream = request.GetRequestStream()) {
    stream.Write(requestBytes, 0, requestBytes.Length);
}
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

// Extract the data from the response without relying on the HTTP Content-Length header
// (we cannot trust all providers to set it correctly).
const int bufferSize = 1024 * 64;
List<byte> responseBytes = new List<byte>();
using(Stream stream = new BufferedStream(response.GetResponseStream(), bufferSize)) {
    int value;
    while((value = stream.ReadByte()) != -1) {
        responseBytes.Add((byte) value);
    }
}

これは、プロキシサーバーがオフになっている場合、またはURLが認証を必要としないものとしてホワイトリストに登録されている場合は正常に機能しますが、認証がアクティブになるとすぐに、HTTP407エラーで常に失敗します。

上記のコードをテストハーネスに入れて、request.Proxyプロパティを構成するために考えられるすべての方法を試しましたが、成功しませんでした。

次に、呼び出す必要のあるすべてのサードパーティWebサービスがHTTPSであることに気付きました。代わりにHTTPとしてアクセスしようとすると、プロキシ認証が機能し始めました。プロキシ認証とHTTPSをうまく再生するためにジャンプする必要がある余分なフープはありますか?

PS:オープンソースのSmoothWallプロキシサーバーでも同じ問題が発生するため、ISAサーバーのバグとして単に書き留めることはできません。

PPS:app.configでプロキシ設定を構成できることは承知していますが、(a)コードで構成しても違いはなく、(b)アプリケーションの設計では、プロキシ設定をから読み取る必要があります。実行時のデータベース。

10

私はこの質問を書き留めなければならないと思います。私の元の投稿されたコードは時々機能するように見えます。私たちのプロキシサーバーは非常に信頼性がありません。 1分間はソフトウェアからのインターネット接続をブロックし、次はそれを許可します。 IT担当者はそれについて何もする力がないようであり、私たち(IT部門外の全員)にはネットワークインフラストラクチャに変更を加える権限がありません。

信頼性の低いプロキシサーバーを補うためにコードを「強化」する方法について誰かがアイデアを持っているなら、私はそれらを聞いてみたいと思います。 :-)

1

App.configでプロキシを設定してみましたか?

プロキシを無効にするには、App.configファイルに次の構成を追加します

<system.net>
  <defaultProxy enabled="false" useDefaultCredentials="false">
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>

プロキシを有効にし、デフォルトのプロキシ設定(IEで指定)を使用するには、この構成をApp.configに追加します

<system.net>
  <defaultProxy enabled="true" useDefaultCredentials="true">
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>
13
abhilash

私も同じような状況でした

コードを実行する前にインターネットにアクセスしたときに、それが機能することに気づきましたか?何年もインターネットにアクセスしていなかった場合(私にとっては20分)、エラーが発生しました。

プロキシ資格情報を直接設定しようとしましたか?

//setup the proxy
request.Proxy = new WebProxy("proxyIp", 8080);
request.Proxy.Credentials = CredentialCache.DefaultCredentials;

これで問題が解決することを願っています

3
dbones

プロキシサーバーの証明書に問題がありますか?サービスがHTTPSを確立できない場合、エラーがスローされます。

0
AUSteve