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

这发生在针对Google云消息传递进行编码的情况下,但适用于其他地方。

考虑以下:

var http = new HttpClient(); http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("key=XXX"); 

 var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "key=XXX"); 

两者都生成一个FormatException:

System.FormatException:值key = XXX'的格式无效。

解决方法是删除等号。

  1. 挖掘reflection器显示有一些validation和parsing代码,当添加一个新的头部值时运行。 为什么这一切都是必要的? 难道这个客户不应该离开我们的方式吗?

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

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

 var http = new HttpClient(); http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX"); 

为了“为什么所有这些(parsing和validation)必要”的问题,答案是: 它是在HTTP标准中定义的。

在HTTP / 1.1和RFC2617中 ,身份validation头(如WWW-Authenticate和Authorization)的值分为两部分: scheme部分和参数部分

对于HTTP基本authentication,该scheme是“基本”,参数可能是类似于“QWxhZGRpbjpvcGVuIHNlc2FtZQ ==” ,所以整个头成为:

 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

这就是为什么你的“key = XXX”不能通过validation,因为它缺less一个scheme部分。

我通过以下方式设置授权标头来解决这个exception(由值中的逗号引起的我的FormatException):

 var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value"); client.DefaultRequestHeaders.Authorization = authenticationHeaderValue; 

今天早上我已经经历了几个问题,同时处理了一个不遵循HTTP规范的外部API。

作为我发布的一部分,他们希望Content-TypeContent-Disposition不能被添加到HttpClient对象中。 要添加这些标题,您需要创build一个HttpRequestMessage 。 在那里,您需要将标题添加到Content属性。

 private HttpRequestMessage GetPostMessage(string uri, string contentType, string fileName, Stream content) { var request = new HttpRequestMessage { Content = new StreamContent(content), RequestUri = new Uri(uri), Method = HttpMethod.Post }; // contentType = "video/mp4" request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); //Need TryAddWithoutValidation because of the equals sign in the value. request.Content .Headers .TryAddWithoutValidation("Content-Disposition", $"attachment; filename=\"{Path.GetFileName(fileName)}\""); // If there is no equals sign in your content disposition, this will work: // request.Content.Headers.ContentDisposition = // new ContentDispositionHeaderValue($"attachment; \"{Path.GetFileName(fileName)}\""); return request; }