2

データベース Web サイトの PDF に直接リンクしている URL のリストがあります。プロキシ サーバー経由で Web サイトにアクセスする必要があることを除けば、ダウンロード プロセスを自動化するのは非常に簡単です。私が使用しようとしてきたコードは次のとおりです。

 public void Download()
 {
   WebClient wb2 = new WebClient();
   WebProxy proxy = new WebProxy("PROXY_URL:port", true);
   proxy.Credentials = new NetworkCredential("USERNAME", "PASSWORD");
   GlobalProxySelection.Select = proxy;

   try
   {
     for(int i = 0; i < URLList.Length; i++)
     {
        byte[] Data = DownloadData(URLList[i]);

        FileStream fs = new FileStream(@"D:\Files\" + i.toString() + ".pdf", FileMode.Create)
        fs.Write(Data, 0, Data.Length);
        fs.Close();
     }
   }
   catch(WebException WebEx)
   {
     MessageBox.Show(WebEx.Message);
   }
 }

 public byte[] DownloadData(string path)
 {
   WebClient wb2 = new WebClient();
   wb2.Credentials = new NetworkCredential("USERNAME","PASSWORD");
   return wb2.DownloadData(path);
 }

なぜか毎回「(400): Bad Request」というエラーが返ってきます。私は明らかに Firefox を介してこれらの PDF に問題なくアクセスできるので、ここで何が間違っているのか疑問に思っています。私は一般的なプログラミングにはかなり慣れていませんが、C# を使用した Web プロトコルには非常に慣れていません。どんな助けでも大歓迎です。

4

1 に答える 1

0

フィドラーを使用して、コードが送信するリクエストとブラウザ経由のリクエストの違いを調べます。

400 エラーは、不正な形式のリクエストが原因です。あなたを拒否するプロキシ (407) または認証を必要とするサイト (401) とは対照的です。

ちなみに、「wb2.Credentials = ...」という行は、ユーザー名/パスワードをターゲット サーバーに提供しています。これは意図したものですか?

しばらく WebClient を使用していませんが、 var request = HttpWebRequest.Create(); を使用できます。request.Proxy = プロキシ; request.GetResponse().GetResponseStream() を実行し、BinaryReader() を使用してバイトを読み取ります。

これにより、FileStream を使用するのではなく、File.WriteAllBytes() を使用してファイルに書き込むことができるバイト配列が得られます。

h番目

于 2011-09-12T05:42:05.947 に答える