我正在尝试从不包含该文件的链接下载文件,而是重定向到包含实际文件的另一个(临时)链接。目标是获得程序的更新副本,而无需打开浏览器。链接是:
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的参数。但是如何将文件检索到我的目录?是的,我是一个菜鸟...先谢谢你的帮助。
答案 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一起使用。