添加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'的格式无效。
解决方法是删除等号。
-
挖掘reflection器显示有一些validation和parsing代码,当添加一个新的头部值时运行。 为什么这一切都是必要的? 难道这个客户不应该离开我们的方式吗?
-
你如何逃避等号,以便添加此值成功?
不知道是否仍然相关,但我最近遇到了同样的问题,并能够通过调用不同的方法来添加标题信息来解决它:
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-Type
和Content-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; }