我尝试使用下面的 C# 代码发出 GET api 请求,但失败并显示
System.Net.WebException: The remote server returned an error: (401) Unauthorized.
at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
at System.Net.WebClient.DownloadString(Uri address)
at System.Net.WebClient.DownloadString(String address)
at Rextester.Program.callAPI()
at Rextester.Program.Main(String[] args)
请注意,相同的 API 请求通过 postman 工作。 .
private static void callAPI()
{
WebClient client = new WebClient();
client.UseDefaultCredentials = false;
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
client.Headers.Add("Authorization", "Basic " + Base64Encode("<id:password>"));
client.Headers.Add("Content-Type", "application/json");
client.Headers.Add("Environment-Id", "325");
client.QueryString.Add("query", "%7B%7D");
string reply = client.DownloadString("https://<server-api-url>");
Console.WriteLine(reply);
}
private static string Base64Encode(string plainText)
{
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
var encodedS = System.Convert.ToBase64String(plainTextBytes);
Console.WriteLine(encodedS);
return encodedS;
}
另一个奇怪的事实是,我看到在编码字符串之前打印了异常。我应该反过来想。由于方法调用发生在进行 api 调用之前,因此应先打印编码后的字符串。
最佳答案
从 @Panagiotis Kanavos 获得一些指导后,我跟踪了来自 Fiddler 的 api 调用,并了解到 api 调用正在被重定向(http 状态代码 - 307)。默认情况下,C# 客户端配置为不在重定向上传递授权 header 。因此我收到了 401 未经授权的错误。 这是fixed通过添加对 401 状态代码的检查并使用授权 header 重新发送 api 请求。
感谢@Panagiotis Kanavos 的帮助
关于c# - WebClient GET 请求失败并显示 401 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53370591/