Подтвердить что ты не робот

Добавление заголовков 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 '.

Решение состоит в том, чтобы удалить знак равенства.

  • Копаем в отражатель показывает, что есть куча проверки и анализа кода, который запускается при добавлении нового значения заголовка. Почему все это необходимо? Разве этот клиент просто не будет уходить с нашего пути?

  • Как вы выходите из знака равенства, чтобы сменить это значение?

4b9b3361

Ответ 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;
}