简而言之,我需要以编程方式检测网页的GET请求。
长话短说,我的公司目前正试图为一款专有软件编写一个小型安装程序,以安装另一款软件。
要获得另一个软件,我意识到它很简单,只需通过C#可爱的WebClient
类调用下载链接(Dir
只是AppData/Local中的Temp目录):
using (WebClient client = new WebClient())
{
client.DownloadFile("[download link]", Dir.FullName + "\setup.exe");
}
但是,安装程序所在的页面并不是直接下载页面。实际的下载链接可能会更改(我们公司的特定安装程序可能会在另一次托管在不同的下载服务器上)。
为了解决这个问题,我意识到我可以监视页面发出的get请求,并从中动态获取URL。
所以,我知道我会这么做,但我只是想知道,语言中是否有一个内置的部分可以让你看到页面发出了什么请求?或者我必须自己编写这个功能,什么是一个好的起点?
我想我应该这样做。首先下载下载页面(包含下载文件链接的页面)的HTML内容。然后抓取HTML以找到下载链接URL。最后,从抓取的地址下载文件。
using (WebClient client = new WebClient())
{
// Get the website HTML.
string html = client.DownloadString("http://[website that contains the download link]");
// Scrape the HTML to find the download URL (see below).
// Download the desired file.
client.DownloadFile(downloadLink, Dir.FullName + "\setup.exe");
}
为了从网站上抓取下载URL,我建议使用HTML敏捷包。请参阅此处开始使用。
我认为您必须编写自己的"mediahandler",它返回HttpResponseMessage。
例如,使用webapi2
[HttpGet]
[AllowAnonymous]
[Route("route")]
public HttpResponseMessage GetFile([FromUri] string path)
{
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(new FileStream(path, FileMode.Open, FileAccess.Read));
string fileName = Path.GetFileNameWithoutExtension(path);
string disposition = "attachment";
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue(disposition) { FileName = fileName + Path.GetExtension(absolutePath) };
result.Content.Headers.ContentType = new MediaTypeHeaderValue(MimeMapping.GetMimeMapping(Path.GetExtension(path)));
return result;
}