2011-09-12 103 views
2

我有一個直接鏈接到數據庫網站上的PDF的URL列表。除非我必須通過代理服務器訪問網站,否則自動執行下載過程將非常容易。我一直在試圖使用的代碼一直是這個:通過代理下載PDF

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#的網絡協議來說,這是一個新手。任何幫助,將不勝感激。

+0

您是否重新檢查了URLList。我的意思是,如果它有錯別字或者特殊字符干擾.... – loxxy

+0

沒有特殊字符,並且當粘貼到Firefox或IE時URL可以正常工作。 – Agni451

回答

0

使用fiddler來計算代碼發送的請求與通過瀏覽器發送的請求之間的差異。

400錯誤是由於格式錯誤的請求造成的;與代理拒絕你(407)或需要認證的網站(401)相反。

意外地,行「wb2.Credentials = ...」正在提供您的用戶名/密碼到目標服務器。這是打算嗎?有一段時間沒有使用過WebClient,但是你可以使用var request = HttpWebRequest.Create();但是你可以使用var request = HttpWebRequest.Create()。 request.Proxy = proxy; request.GetResponse()。GetResponseStream()並使用BinaryReader()讀取字節。

這會給你可以使用File.WriteAllBytes()寫入文件的字節數組,而不必使用FileStream。

hth