如何从重定向的URL下载文件?

时间:2014-02-02 12:49:17

标签: c# redirect download httpwebrequest

我正在尝试从不包含该文件的链接下载文件,而是重定向到包含实际文件的另一个(临时)链接。目标是获得程序的更新副本,而无需打开浏览器。链接是:

http://www.bleepingcomputer.com/download/minitoolbox/dl/65/

我尝试过使用WebClient,但它不起作用:

private void Button1_Click(object sender, EventArgs e)
{
      WebClient webClient = new WebClient();
      webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
      webClient.DownloadFileAsync(new Uri("http://www.bleepingcomputer.com/download/minitoolbox/dl/65/"), @"C:\Downloads\MiniToolBox.exe");
}

在搜索并尝试了很多事情之后,我发现了这个涉及使用HttpWebRequest.AllowAutoRedirect的解决方案。

Download file through code that has a redirect?

// Create a new HttpWebRequest Object to the mentioned URL.
HttpWebRequest myHttpWebRequest=(HttpWebRequest)WebRequest.Create("http://www.contoso.com");    
myHttpWebRequest.MaximumAutomaticRedirections=1;
myHttpWebRequest.AllowAutoRedirect=true;
HttpWebResponse myHttpWebResponse=(HttpWebResponse)myHttpWebRequest.GetResponse();

这似乎正是我正在寻找的,但我根本不知道如何使用它:/ 我猜这个链接是WebRequest.Create的参数。但是如何将文件检索到我的目录?是的,我是一个菜鸟...先谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

我想简单的选择就是这个(在您已经到达那里之后......以及您提供的网址代替http://www.contoso.com):

using (var responseStream = myHttpWebResponse.GetResponseStream()) {
    using (var fileStream = 
              new FileStream(Path.Combine("folder_here", "filename_here"), FileMode.Create)) {
        responseStream.CopyTo(fileStream);
    }
}

编辑:

事实上,这不会奏效。它不是一个下载文件的HTTP重定向。看看那个页面的来源......你会看到这个:

<meta http-equiv="refresh" content="3; url=http://download.bleepingcomputer.com/dl/1f92ae2ecf0ba549294300363e9e92a8/52ee41aa/windows/security/security-utilities/m/minitoolbox/MiniToolBox.exe">

它基本上使用浏览器重定向。不幸的是,你尝试做的事情不会起作用。

答案 1 :(得分:0)

我也从基于WebClient的方法切换为HttpWebRequest,因为自动重定向似乎不适用于WebClient。我使用的代码与您的相似,但无法使其正常工作,也从未重定向到实际文件。看着Fiddler,我可以看到我实际上并没有得到最终的重定向。

然后,我遇到了WebClient in this question的自定义版本的一些代码:

class CustomWebclient: WebClient
{
  [System.Security.SecuritySafeCritical]
  public CustomWebclient(): base()
  {
  }

  public CookieContainer cookieContainer = new CookieContainer();

  protected override WebRequest GetWebRequest(Uri myAddress)
  {
    WebRequest request = base.GetWebRequest(myAddress);
    if (request is HttpWebRequest)
    {
      (request as HttpWebRequest).CookieContainer =   cookieContainer;
      (request as HttpWebRequest).AllowAutoRedirect = true;
    }
    return request;
  }
}

该代码中的关键部分是AllowAutoRedirect = true,默认情况下应该启用according to the documentation,它指出:

  

在WebClient实例中,AllowAutoRedirect设置为true。

,但是当我使用它时,情况似乎并非如此。

我还需要CookieContainer部分,才能与我们尝试访问的SharePoint外部URL一起使用。