我有一个直接链接到数据库网站上的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协议也很陌生。任何帮助将不胜感激。
答案 0 :(得分:0)
使用fiddler来计算代码发送请求与通过浏览器发送的请求之间的差异。
400错误是由于格式错误的请求造成的;反对拒绝你的代理(407)或要求认证的网站(401)。
很明显,“wb2.Credentials = ...”这一行正在为目标服务器提供您的用户名/密码。是这个意图吗?
暂时没有使用过WebClient,但你可以使用var request = HttpWebRequest.Create(); request.Proxy = proxy; request.GetResponse()。GetResponseStream()并使用BinaryReader()读取字节。
这将为您提供可以使用File.WriteAllBytes()写入文件的字节数组,而不必使用FileStream。
HTH