And*_*rew 65 c# dotnet-httpclient google-cloud-messaging
这发生在针对Google Cloud Messaging的编码环境中,但适用于其他地方.
考虑以下:
var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("key=XXX");
Run Code Online (Sandbox Code Playgroud)
和
var http = new HttpClient();
http.DefaultRequestHeaders.Add("Authorization", "key=XXX");
Run Code Online (Sandbox Code Playgroud)
这两个都生成FormatException:
System.FormatException:值key = XXX'的格式无效.
解决方案是删除等号.
深入研究反射器显示,在添加新的标头值时会运行大量的验证和解析代码.为什么这一切都是必要的?难道这个客户不应该让我们走开吗?
如何逃避等号以便添加此值成功?
小智 141
不确定是否仍然相关,但我最近遇到了同样的问题,并能够通过调用另一种方法来添加标题信息来解决它:
var http = new HttpClient();
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
Run Code Online (Sandbox Code Playgroud)
Ter*_*ang 18
对于"为什么所有这些(解析和验证)必要"的问题,答案是:它在HTTP标准中定义.
在HTTP/1.1和RFC2617中,认证头(例如WWW-Authenticate和Authorization)的值包含两部分:方案部分和参数部分.
对于HTTP基本认证,方案是"基本",参数可能类似于"QWxhZGRpbjpvcGVuIHNlc2FtZQ ==",因此整个标题变为:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Run Code Online (Sandbox Code Playgroud)
这就是为什么你的"key = XXX"没有通过验证,因为它缺少一个方案部分.
当我在 Authorization 标头的末尾添加一个空格时,我遇到了这个错误并偶然发现了这篇文章。
this.bearerAuthHttpClient.DefaultRequestHeaders.Add("Authorization ", $"Bearer {token}");
Run Code Online (Sandbox Code Playgroud)
您可以在授权后看到有问题的“ ”。
我花了大约 15 分钟才看到我的错字...
我通过以下方式设置Authorization标头来解决此异常(我的FormatException由值中的逗号引起):
var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value");
client.DefaultRequestHeaders.Authorization = authenticationHeaderValue;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36136 次 |
| 最近记录: |