2013-05-21 111 views
0

我發現了這樣做的不同例子,但一直沒有能夠得到他們的任何組合工作。使用WebClient登錄和下載文件

基本上,我有一個內聯網系統,可以從網頁鏈接生成文件,我知道我想下載哪些文件。我能夠生成我想下載的鏈接列表,但遇到了在程序內對系統進行身份驗證的問題。我一直得到這個這個401錯誤:

Public Shared Sub DownloadFiles(_tool As Tool) 
    Dim links As List(Of String) = GetJiraLinks(_tool) 

    Dim downloader As New WebClient 

    ' Initialize the client 
    Dim reqParm As New Specialized.NameValueCollection 

    reqParm.Add("os_username", "user") 
    reqParm.Add("os_password", "pass") 
    reqParm.Add("os_destination", "/secure/") 

    downloader.Credentials = New NetworkCredential("user", "pass") 

    Dim uploadLocation As String = My.Settings.jiraLocation & "login.jsp" 

    'downloader.Headers.Add("Content-Type", "application/x-www-form-urlencoded") 

    Dim responseBytes = downloader.UploadValues(uploadLocation, "POST", reqParm) 

    Dim responseBody = (New Text.UTF8Encoding).GetString(responseBytes) 

    Dim workingDir As String = CreateWorkingDir() 

    For Each link As String In links 
     Dim tempUri As New Uri(link) 

     Dim localpath As String = workingDir & "\" & System.IO.Path.GetFileName(tempUri.LocalPath) 

     downloader.DownloadFile(tempUri, localpath) 
    Next 
End Sub 
+1

你用[Fiddler](http://www.fiddler2.com)來看看發生了什麼? –

+0

謝謝你。使用這個我可以看到有一個cookie參與。我的猜測是WebClient沒有保存這個cookie。我發現http://stackoverflow.com/questions/2825377/how-can-i-get-the-webclient-to-use-cookies,但它不顯示如何使用它。 – Origin

回答

1

我想我會張貼一個完整的解決方案的工作示例。許多其他帖子鏈接到cookie識別的Web客戶端(How can I get the WebClient to use Cookies?),但未能顯示它的實際操作。這裏是我的:

Public Shared Sub DownloadFiles(_tool As Tool) 
    Dim links As List(Of String) = GetJiraLinks(_tool) 

    Dim downloader As New CookieAwareWebClient 

    ' Start by requesting the page. 

    Dim loginPage As String = My.Settings.jiraLocation & "login.jsp" 

    ' Initialize the client 
    Dim reqParm As New Specialized.NameValueCollection 

    reqParm.Add("os_username", "user") 
    reqParm.Add("os_password", "pass") 
    reqParm.Add("os_destination", "/secure/") 

    Dim responseBytes = downloader.UploadValues(loginPage, "POST", reqParm) 

    Dim responseBody = (New Text.UTF8Encoding).GetString(responseBytes) 

    Dim workingDir As String = CreateWorkingDir() 

    For Each link As String In links 
     Dim tempUri As New Uri(link) 

     Dim localpath As String = workingDir & "\" & System.IO.Path.GetFileName(tempUri.LocalPath) 

     downloader.DownloadFile(tempUri, localpath) 
    Next 
End Sub