通过 C# Webclient 下载文件而不直接 link

Downloading file without direct link through C# Webclient

我正在尝试下载一个文件,但问题是 URL 不是直接 link 到 zip 文件,我的代码给了我无用的错误。

这是代码:

var zipFile = new FileInfo(Path.Combine(directory.FullName, "temp.zip"));
var progressInfo =
    new ProgressBarInfo(
        $"{DateTime.Now:dd-MM-yyyy HH:mm:ss.ffff}\t[PROGRESS] Download IP2Location database");
UiManager.UiImplementation.ShowProgressBar(progressInfo);
try
{
    using (var webClient = new WebClient { Proxy = null })
    {
        var url = $"https://www.ip2location.com/download/?token={downloadToken}&file={DatabaseProduct}";
        webClient.DownloadProgressChanged +=
            (sender, args) =>
                progressInfo.ReportProgress(args.ProgressPercentage / 100d);
        using (var autoResetEvent = new AutoResetEvent(false))
        {
            webClient.DownloadFileCompleted += (sender, args) => autoResetEvent.Set();
            webClient.DownloadFileAsync(new Uri(url), zipFile.FullName);
            autoResetEvent.WaitOne();
        }
    }
}
finally
{
    progressInfo.Close();
}

如果我将 URL 变量更改为直接 link 例如:https://speed.hetzner.de/10GB.bin 那么代码工作正常

如果我访问这个URL:https://www.ip2location.com/download/?token=REDACTED&file=DB11LITE 它将直接下载一个名为 IP2LOCATION-LITE-DB11.CSV.ZIP

的文件

这是我在浏览器中访问URL时的响应头

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 13 Dec 2021 23:22:15 GMT
Content-Type: application/zip
Content-Length: 48726637
Connection: keep-alive
Expires: 0
Cache-Control: must-revalidate, post-check=0, pre-check=0
Pragma: public
Cache-Control: private
Content-Disposition: attachment; filename="IP2LOCATION-LITE-DB11.CSV.ZIP"
Content-Transfer-Encoding: binary
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
Content-Security-Policy: default-src * data: 'unsafe-eval' 'unsafe-inline';frame-ancestors 'self';
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

请务必注意,Webclient class 使用 RETR 命令下载 FTP 资源。对于 HTTP 资源,使用 GET 方法。这意味着,如果您向可下载文件提供不包含正确参数的 URL,您最终会遇到一些未处理的异常,因为 Webclient 已替换为 System.Net.Http.HttpClient,我建议您改用它。

下面您可以看到 Webclient 如何工作的示例,在您的情况下,您会收到“无用错误”,因为您使用的是异步方法。我建议使用像下面这样的正常方法来调试并获得正确的异常。

public void downloadProgrambyURL(string url, string filename)
            {
                using (WebClient client = new WebClient())
                {
                    var pathVariable = "%USERPROFILE%\Downloads\" + filename;
                    var filePath = Environment.ExpandEnvironmentVariables(pathVariable);
                    client.DownloadFile(url, filePath);
                }
            }

另外,我让thislink供大家参考。