我有一个直接链接到数据库网站上 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 协议(protocol)也很陌生。任何帮助将不胜感激。
最佳答案
使用 fiddler 找出您的代码发送的请求与通过您的浏览器发送的请求之间的区别。
400 错误是由于格式错误的请求;反对代理拒绝您 (407) 或网站要求身份验证 (401)。
顺便说一句,“wb2.Credentials = ...”行向目标服务器提供您的用户名/密码。这是故意的吗?
有一段时间没用过WebClient了,不过可以用var request = HttpWebRequest.Create(); request.Proxy = 代理; request.GetResponse().GetResponseStream() 并使用 BinaryReader() 读取字节。
这将为您提供字节数组,您可以使用 File.WriteAllBytes() 将其写入文件,而不必使用 FileStream。
第一个
关于c# - 通过代理下载 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382707/