質問

System.net.WebClientクラスを使用するときに、プロキシ認証エラー(HTTP 407ステータスコード)を堅牢に処理する方法を見つけようとしています。

この分野では、多くのユーザーが407プロキシ認証WebExceptionを受け取っているのがわかりますが、デフォルトの良い戦略が何であるかはわかりません。.NET 2.0/3.5では、プロキシ認証設定は、インターネットエクスプローラーシステム設定から継承されることになっています。Firefox、Opera、およびChromeは、これらの同じ設定を使用しています。

私たちが使用している基本的なコードは次のとおりです。

using System.Net;

string url = "http://www.mysite.com";
WebClient webClient = new WebClient();
byte[] data = webClient.DownloadFile(url);

このコードが失敗したら、ユーザーのブラウザを開き、ヘルプページに送信します。当社のWebログから、これらの顧客はブラウザで正常に接続できることを知っています。おそらく、彼らは私たちのヘルプページに到達する前に、プロキシユーザー名とパスワードを手動で入力していますか?分かりません。

WebClient.UsedEfaultCreDentialsを使用できるようですが、WebClientがとにかくシステム設定を使用している場合、これは冗長のようです。

助けていただければ幸いです。

役に立ちましたか?

解決

プロキシ認証で BASIC または DIGEST を使用する場合、Internet Explorer はプロキシ認証資格情報を永続的にキャッシュ/再利用しません。ネゴシエート/NTLM の場合、デフォルトの資格情報が提供されます。

したがって、.NET が IE の設定を継承しているとしても、IE で実行している場合を除き、ベーシック/ダイジェストのプロキシ認証に対する「無料」サポートは得られません。ユーザーにプロンプ​​トを表示するか、構成画面を提供する必要があります。

Fiddler (www.fiddler2.com) には、[ルール] メニューに [プロキシ認証の要求] オプションがあり、このオプションを使用して、テスト用のシナリオをシミュレートできます。

他のヒント

ユーザーが「プロキシを使用」を選択できる設定ダイアログを追加することで、この問題を解決しました。 この設定が完了したら、これらのパラメーター(アドレス、資格情報...)を使用します。 そうでない場合-手動による操作なしで接続が確立できると想定します。 エラーが発生した場合: a。)デフォルトの認証情報を使用して再試行 b。)configの設定が役立つ情報をポップアップ表示します...

「デフォルトの認証情報」を介してプロキシ認証が行われる場合(Windowsユーザー)IEは認証エラーにも反応し、この場合デフォルトの資格情報を送信します。 これが機能しない場合は、資格情報ダイアログが開きます。 すべてのブラウザーがこの方法で処理するかどうかはわかりませんが、フィドラーを使用して試してみるだけで、何が起こっているのかを確認できます。

これは古い投稿であることは知っていますが、SSIS 2008R2(SQL Server Integration Services)スクリプトタスク(VB.NETコード)でWebClientを使用して、プロキシサーバーを介してリモートサイトにXMLファイルをダウンロードしようとすると同様の問題が発生しましたまた、認証を必要とするSSLで保護されています。

解決策を見つけるのにしばらく時間がかかり、この投稿はプロキシ側で役立ちました。以下は私のために働いたスクリプトコードです。似たようなものを探している人には役立つかもしれません。

    Dim objWebClient As WebClient = New WebClient()
    Dim objCache As New CredentialCache()

    'https://www.company.net/xxxx/resources/flt
    Dim strDownloadURL As String = Dts.Variables("FileURL").Value.ToString

    'apiaccount@company.net
    Dim strLogin As String = Dts.Variables("FileLogin").Value.ToString

    'sitepassword
    Dim strPass As String = Dts.Variables("FilePass").Value.ToString

    'itwsproxy.mycompany.com
    Dim strProxyURL As String = Dts.Variables("WebProxyURL").Value.ToString

    '8080
    Dim intProxyPort As Integer = Dts.Variables("WebProxyPort").Value

    'Set Proxy & Credentials as a Network Domain User acc to get through the Proxy
    Dim wp As WebProxy = New WebProxy(strProxyURL, intProxyPort)
    wp.Credentials = New NetworkCredential("userlogin", "password", "domain")
    objWebClient.Proxy = wp

    'Set the Credentials for the Remote Server not the Network Proxy
    objCache.Add(New Uri(strDownloadURL), "Basic", New NetworkCredential(strLogin, strPass))
    objWebClient.Credentials = objCache

    'Download file, use Flat File Connectionstring to save the file
    objWebClient.DownloadFile(strDownloadURL, Dts.Connections("XMLFile").ConnectionString)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top