HttpClient不接受授权头信息(401未经授权)?

3
我正在创建一个Xamarin.Forms移动应用程序,使用.NET Standard作为代码共享方法,目标是Android。不幸的是,我正在使用System.Net.Http中的HttpClient时,与Postman不同,API无法正常工作。
在Postman请求中使用以下标头: Request Screenshot 我尝试了3种不同的方法,但它们仍然返回“401未授权”。我还检查了Android清单文件中的INTERNET权限。
HttpClient.DefaultRequestHeaders.Add("Authorization", "Token e2eeb1aa9f32eb0ekgn353b6fadb772");
HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Token", "e2eeb1aa9f32eb0ekgn353b6fadb772");
HttpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "Token e2eeb1aa9f32eb0ekgn353b6fadb772");

尝试添加调用 HttpClient.DefaultRequestHeaders.Clear(); 以确保其中没有其他标头。 - Gerald Versluis
我也尝试过,但没有成功。 - iamlawrencev
此外,“Token”似乎有些奇怪。通常应该是“Bearer”吧? - Gerald Versluis
1
通常是使用 Bearer,但当我使用 Bearer 时会抛出错误。只有通过在头部使用 Authorization: Token <空格> <Token 值> 才能在 Postman 中正常工作。 - iamlawrencev
我的答案中的解决方案有效吗? - Kristoffer Jälén
3个回答

9

请确保您的HTTP请求URL是否正确,有时需要一个尾随斜杠 ( '/' ). 如果在HTTP客户端中遗漏了这一点,将无法工作,但POSTMAN可以。


3
没错,由于那个缺失的反斜杠,我浪费了一个小时的时间去研究401错误信息。 - ppenchev
Postman对于http和https也很宽容 - 在我的情况下,C#需要使用https。 - Daniel
我认为答案中有一个打字错误。反斜杠是这个 - ' \ '。 - Anil P Babu

2
尝试在HttpRequestMessage上设置标题:
request.Headers.Authorization = new 
    AuthenticationHeaderValue("Bearer","e2eeb1aa9f32eb0ekgn353b6fadb772");

这个答案今天帮了我很大的忙。之前我在client.DefaultRequestHeaders级别上设置授权头,但是没有起作用。 - user1451111

0
在我的情况下,当我在AuthenticationHeaderValue中设置基本身份验证时,问题得到了解决。
var authToken = Encoding.ASCII.GetBytes(_UserName + ":" + _Password);
client.DefaultRequestHeaders.Authorization= new AunthenticationHeaderValue("Basic", Convert.ToBase64String(authToken));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接