Добавление заголовков 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: неверен формат ключа значения = XXX '.
Решение состоит в том, чтобы удалить знак равенства.
-
Копаем в отражатель показывает, что есть куча проверки и анализа кода, который запускается при добавлении нового значения заголовка. Почему все это необходимо? Разве этот клиент просто не будет уходить с нашего пути?
-
Как вы выходите из знака равенства, чтобы сменить это значение?
Ответы
Ответ 1
Не уверен, что все еще актуально, но я недавно столкнулся с этой проблемой и смог решить ее, вызвав другой метод для добавления информации заголовка:
var http = new HttpClient();
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
Ответ 2
К вашему "почему все это (разбор и проверка) необходимо" вопрос ", ответ таков: он определен в стандарте HTTP.
В HTTP/1.1 и RFC2617 значение заголовка проверки подлинности (например, WWW- Аутентификация и авторизация) состоит из двух частей: части схемы и части параметра.
Для базовой проверки подлинности HTTP схема "Basic", и параметр может быть чем-то вроде "QWxhZGRpbjpvcGVuIHNlc2FtZQ ==", поэтому весь заголовок становится:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Вот почему ваш "ключ = XXX" не проходит проверку, потому что ему не хватает части схемы.
Ответ 3
Я обошел это исключение (мое FormatException, вызванное запятыми в значении), установив заголовок авторизации следующим образом:
var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value");
client.DefaultRequestHeaders.Authorization = authenticationHeaderValue;
Ответ 4
Сегодня утром я задал несколько вопросов, обращаясь к внешнему API, который не соответствует спецификации HTTP для письма.
Как часть моего сообщения, они хотят Content-Type
и Content-Disposition
, которые нельзя добавить в объект HttpClient
. Чтобы добавить эти заголовки, вам необходимо создать 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;
}