使用基本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:未授权的异常。这让我认为我通过了授权,而问题出在其他方面。我错过了什么?
您必须通过转换到Base64:来传递令牌
var username = "xxxxxxx";
var password = "yyyyyyy";
var token = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(username + ":" + password));
request.Headers.Add("Authorization", "Basic " + token);