如何使用HttpWebRequest下载文件

6

我是一位有帮助的助手,将为您进行文本翻译。

试图在代码中下载文件。

当前的代码:

  Dim uri As New UriBuilder
    uri.UserName = "xxx"
    uri.Password = "xxx"
    uri.Host = "xxx"
    uri.Path = "xxx.aspx?q=65"

   Dim request As HttpWebRequest = DirectCast(WebRequest.Create(uri.Uri), HttpWebRequest)

    request.AllowAutoRedirect = True

    request = DirectCast(WebRequest.Create(DownloadUrlIn), HttpWebRequest)
    request.Timeout = 10000
    'request.AllowWriteStreamBuffering = True

    Dim response As HttpWebResponse = Nothing
    response = DirectCast(request.GetResponse(), HttpWebResponse)
    Dim s As Stream = response.GetResponseStream()

    'Write to disk
    Dim fs As New FileStream("c:\xxx.pdf", FileMode.Create)

    Dim read As Byte() = New Byte(255) {}
    Dim count As Integer = s.Read(read, 0, read.Length)
    While count > 0
        fs.Write(read, 0, count)
        count = s.Read(read, 0, read.Length)
    End While

    'Close everything
    fs.Close()
    s.Close()
    response.Close()

运行此代码并检查response.ResponseUri,提示我被重定向回登录页面而不是pdf文件。由于某种原因,它没有授权访问,我可能错过了什么,因为我在uri中发送了用户名和密码?感谢您的帮助。

页面是否实际允许通过URL进行授权?还是需要通过设置cookie的Web界面进行授权?我猜测是后者,如果是这样,您将需要执行2个请求,第一个请求用于登录并存储cookie,第二个请求使用cookie请求PDF。 - Steve
这段代码为我开始下载提供了很好的起点。谢谢伙计。 - MiBol
3个回答

4

你不需要那么多代码来从网络上下载文件,只需使用WebClient类及其DownloadFile方法即可。


尝试过这个方法,但是仍然存在同样的问题,即重定向到登录页面。 - David

0

随着UWP的出现,这个问题变得更加重要,因为UWP没有WebClient。对于这个问题的正确答案是,如果您被重定向到登录页面,则必须检查您的凭据或者HttpWebRequest的设置(或缺乏设置)头部是否有问题。

根据Microsoft的说法,下载请求是通过调用HttpWebRequest上的GetResponse()发送的,因此下载的文件应该在响应流中(由上面提到的GetResponse()调用返回的响应中)。


0

你应该检查并查看网站是否需要 cookie(大多数需要),我建议使用数据包分析器运行代码并查看服务器返回的内容,可以使用 Fiddler 或 HTTP Analyzer 记录数据包


Chrome开发者工具或带有Firebug的Firefox足以确定cookie的存在以及实际请求和响应头。但是在某些Web应用程序上,还有更复杂的脚本检测方法。 - scones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接