【问题标题】:Download PDFs through proxy通过代理下载 PDF
【发布时间】:2011-11-15 00:16:54
【问题描述】:

我有一个直接链接到数据库网站上的 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): Bad Request”。我显然可以通过 Firefox 很好地访问这些 PDF,所以我想知道我在这里做错了什么。一般来说,我对编程很陌生,对通过 C# 的 Web 协议也很陌生。任何帮助将不胜感激。

【问题讨论】:

  • 您是否重新检查了 URLList。我的意思是如果它有错别字或特殊字符干扰......
  • 无特殊字符,粘贴到 Firefox 或 IE 中的 URL 可以正常工作。

标签: c# proxy download data-stream


【解决方案1】:

使用 fiddler 找出您的代码发送的请求与通过浏览器发送的请求之间的区别。

400 错误是由于请求格式不正确;反对代理拒绝您 (407) 或需要身份验证的站点 (401)。

顺便说一句,“wb2.Credentials = ...”行正在向目标服务器提供您的用户名/密码。这是故意的吗?

好久没用WebClient了,不过可以用var request = HttpWebRequest.Create(); request.Proxy = 代理; request.GetResponse().GetResponseStream() 并使用 BinaryReader() 读取字节。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-13
    • 2016-03-22
    • 2022-11-11
    • 2021-11-20
    • 2013-08-03
    • 1970-01-01
    • 2019-05-16
    • 2017-12-11
    相关资源
    最近更新 更多