如何以编程方式检测网页 GET 请求的来源? (C#)

How to detect the origin of a webpage's GET requests programmatically? (C#)

简而言之,我需要以编程方式检测网页的 GET 请求。

长话短说,我的公司目前正在尝试为一款专有软件编写一个小型安装程序,该软件可以安装另一款软件。

要获得这另一个软件,我意识到它就像通过 C# 可爱的 WebClient class 调用下载 link 一样简单(Dir 只是 Temp AppData/Local 中的目录):

using (WebClient client = new WebClient())
{
    client.DownloadFile("[download link]", Dir.FullName + "\setup.exe");
}

但是,安装程序的来源页面并不是直接下载页面。实际下载 link 可能会发生变化(我们公司的特定安装程序可能会在另一时间托管在不同的下载服务器上)。

为了解决这个问题,我意识到我可以只监视页面发出的 GET 请求并从那里动态获取 URL。

所以,我知道我要做,但我只是想知道,是否有一个内置的语言部分可以让您查看页面发出的请求?还是我必须自己编写此功能,什么是好的起点?

我认为您必须自己编写 "mediahandler",其中 returns 一个 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;
}

我想我会这样做。首先下载下载页面的HTML内容(包含link下载文件的页面)。然后抓取 HTML 找到下载 link 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 Agility Pack。请参阅 here 开始使用它。