System.Net.WebClient とプロキシ認証 407 エラー
質問
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)