使用基本URL授权从Web下载文件

本文关键字:Web 下载 文件 授权 URL | 更新日期: 2023-09-27 18:01:08

我可以在浏览器中使用以下链接成功下载文件:

https://userbob:qwerty@assoc-datafeeds-na.amazon.com/datafeed/getReport?filename=馈送报告-1265.xml.gz

现在我需要在我的C#应用程序中执行此操作。

解决方案1:使用WebClient

        string url = $"https://assoc-datafeeds-na.amazon.com/datafeed/getReport?filename=feedreport-1265.xml.gz";

        using (var webClient = new WebClient())
        {
            string authInfo =Convert.ToBase64String(Encoding.Default.GetBytes("userbob:qwerty"));
            webClient.Headers[HttpRequestHeader.Authorization] = "Basic " + authInfo;
            webClient.Headers[HttpRequestHeader.ContentType] = "application/octet-stream";
            webClient.Headers[HttpRequestHeader.UserAgent] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
            var data = webClient.DownloadData(url);
        }

DownloadData引发异常:远程服务器返回错误:(500(内部服务器错误。

解决方案2:使用WebRequest

        var request = WebRequest.Create(url);
        string authInfo =Convert.ToBase64String(Encoding.Default.GetBytes("userbob:qwerty"));
        ((HttpWebRequest)request).CookieContainer = new CookieContainer();
        request.Headers["Authorization"] = "Basic " + authInfo;
        ((HttpWebRequest)request).UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
        ((HttpWebRequest)request).ContentType = "application/octet-stream";
        var response = request.GetResponse();

最后一行出现了相同的异常。我觉得我缺少了一些标题或设置来完全模仿浏览器的行为。

有趣的是,如果我在任何一个解决方案中省略Authorization头,我会得到401:未授权的异常。这让我认为我通过了授权,而问题出在其他方面。我错过了什么?

使用基本URL授权从Web下载文件

您必须通过转换到Base64:来传递令牌

var username = "xxxxxxx";
var password = "yyyyyyy";
var token = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password));
request.Headers.Add("Authorization", "Basic " + token);