通过代理下载PDF

时间:2011-09-12 02:11:52

标签: c# proxy download data-stream

我有一个直接链接到数据库网站上的PDF的URL列表。除了必须通过代理服务器访问网站这一事实外,下载过程自动化非常容易。我一直试图使用的代码是:

 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):错误请求”。我显然能够通过Firefox获得这些PDF文件,所以我想知道我在这里做错了什么。我对编程很新,对C#的Web协议也很陌生。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用fiddler来计算代码发送请求与通过浏览器发送的请求之间的差异。

400错误是由于格式错误的请求造成的;反对拒绝你的代理(407)或要求认证的网站(401)。

很明显,“wb2.Credentials = ...”这一行正在为目标服务器提供您的用户名/密码。是这个意图吗?

暂时没有使用过WebClient,但你可以使用var request = HttpWebRequest.Create(); request.Proxy = proxy; request.GetResponse()。GetResponseStream()并使用BinaryReader()读取字节。

这将为您提供可以使用File.WriteAllBytes()写入文件的字节数组,而不必使用FileStream。

HTH