WebClient GET请求因401未经授权而失败

时间:2018-11-19 08:10:11

标签: c# api webclient unauthorized

我正在尝试使用下面的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调用之前进行的。

1 个答案:

答案 0 :(得分:1)

从@Panagiotis Kanavos得到一些指导后,我跟踪了Fiddler的api调用,并了解到该api调用已被重定向(http状态码-307)。默认情况下,C#客户端配置为在重定向时不传递授权标头。因此,我收到401未经授权的错误。 通过添加对401状态代码的检查并使用授权标头重新发送api请求,这是fixed

感谢@Panagiotis Kanavos提供帮助