Это произошло в контексте кодирования для Google Cloud Messaging, но применимо и в других местах.
Обратите внимание на следующее:
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 'недействителен.
Решение - убрать знак равенства.
Углубление в отражатель показывает, что при добавлении нового значения заголовка выполняется куча кода проверки и анализа. Зачем все это нужно? Разве этот клиент не должен просто уйти с нашего пути?
Как избежать знака равенства, чтобы добавить это значение успешно?
Ответы:
Не уверен, что все еще актуально, но недавно я столкнулся с этой же проблемой и смог решить ее, вызвав другой метод для добавления информации заголовка:
var http = new HttpClient(); http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
источник
HttpRequestMessage
вместо этого, и это не имело никакого значения. ЭтотTryAddWithoutValidation
метод помог мне.На ваш вопрос «зачем все это (синтаксический анализ и проверка)» ответ таков: это определено в стандарте HTTP.
В HTTP / 1.1 и RFC2617 значение заголовка аутентификации (например, WWW-Authenticate и Authorization) состоит из двух частей: части схемы и части параметра .
Для базовой аутентификации HTTP используется схема «Базовая», а параметр может иметь вид «QWxhZGRpbjpvcGVuIHNlc2FtZQ ==» , поэтому весь заголовок выглядит следующим образом:
Вот почему ваш "key = XXX" не проходит проверку, потому что в нем отсутствует часть схемы.
источник
Bearer
эту схему, но она все еще показывает ошибку.Я обошел это исключение (мое исключение FormatException, вызванное запятыми в значении), установив заголовок авторизации следующим образом:
var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value"); client.DefaultRequestHeaders.Authorization = authenticationHeaderValue;
источник
Я столкнулся с этой ошибкой и наткнулся на этот пост, когда добавил пробел в конец заголовка авторизации.
this.bearerAuthHttpClient.DefaultRequestHeaders.Add("Authorization ", $"Bearer {token}");
Вы можете увидеть оскорбительное "" после авторизации.
Мне потребовалось около 15 минут, прежде чем я увидел свою опечатку ...
источник
Сегодня утром я задал несколько вопросов, когда имел дело с внешним 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; }
источник
В моем случае я генерирую строковые значения ETags из поля SQL byte [] RowVersion. Поэтому мне нужно добавить обертку сгенерированного файла. т.е. AAAAAAAAF5s = строка внутри "следующим образом ...
var eTag = department.RowVersion.ToETagString(); httpClient.DefaultRequestHeaders.Add(Microsoft.Net.Http.Headers.HeaderNames.IfMatch, $"\"{eTag}\"") public class DepartmentForHandleDto { public string Name { get; set; } public string GroupName { get; set; } public byte[] RowVersion { get; set; } } public static class ByteArrayExtensions { public static string ToETagString(this byte[] byteArray) { return Convert.ToBase64String(byteArray != null && byteArray.Length > 0 ? byteArray : new byte[8]); } }
источник