添加HttpClient标头会生成带有一些值的FormatException

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'的格式无效.

解决方案是删除等号.

  1. 深入研究反射器显示,在添加新的标头值时会运行大量的验证和解析代码.为什么这一切都是必要的?难道这个客户不应该让我们走开吗?

  2. 如何逃避等号以便添加此值成功?

小智 141

不确定是否仍然相关,但我最近遇到了同样的问题,并能够通过调用另一种方法来添加标题信息来解决它:

var http = new HttpClient();
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
Run Code Online (Sandbox Code Playgroud)

  • 将此标记为答案,即使我仍然不明白为什么其他方法在验证时失败,如果它是有效值. (8认同)
  • 我看到这是一个旧线程,但是我只是遇到了这个问题@EdSykes并尝试使用`HttpRequestMessage`来代替,这没什么区别。``TryAddWithoutValidation`''方法对我有用。 (3认同)
  • 如果您不希望在默认标头中使用此方法,也可以在 HttpRequestMessage 上调用此方法 (2认同)

Ter*_*ang 18

对于"为什么所有这些(解析和验证)必要"的问题,答案是:它在HTTP标准中定义.

HTTP/1.1RFC2617中,认证头(例如WWW-Authenticate和Authorization)的值包含两部分:方案部分和参数部分.

对于HTTP基本认证,方案是"基本",参数可能类似于"QWxhZGRpbjpvcGVuIHNlc2FtZQ ==",因此整个标题变为:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Run Code Online (Sandbox Code Playgroud)

这就是为什么你的"key = XXX"没有通过验证,因为它缺少一个方案部分.

  • @Kurlak: key=value 仅对“auth-param”部分有效,对整个“credentials”部分无效。CodeCaster的解释不太正确。 (2认同)
  • 我实际上是在使用`Bearer`作为方案,但是它仍然向我显示错误。 (2认同)

Rob*_*kes 7

当我在 Authorization 标头的末尾添加一个空格时,我遇到了这个错误并偶然发现了这篇文章。

this.bearerAuthHttpClient.DefaultRequestHeaders.Add("Authorization ", $"Bearer {token}");
Run Code Online (Sandbox Code Playgroud)

您可以在授权后看到有问题的“ ”。

我花了大约 15 分钟才看到我的错字...


CRi*_*ice 5

我通过以下方式设置Authorization标头来解决此异常(我的FormatException由值中的逗号引起):

var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value");
client.DefaultRequestHeaders.Authorization = authenticationHeaderValue;
Run Code Online (Sandbox Code Playgroud)