Как добавить «Content-Type = application / json; v = 2.0», включая управление версиями с помощью HttpClient?

#c# #.net #asp.net-web-api2 #aspnet-api-versioning

#c# #.net #asp.net-web-api2 #aspnet-api-управление версиями

Вопрос:

Извините, что задаю этот вопрос таким образом. Я могу дать вам ощущение, что я хотел бы, чтобы вы сделали код для меня. Я уже потратил день на то, чтобы написать код для отправки http-запроса, который содержит заголовок с управлением версиями:

Для управления версиями я использую управление версиями по типу носителя из проекта Microsoft / aspnet-api-versioning.

Моя часть API работает нормально, и я могу запросить правильную версию без проблем с Postman:

введите описание изображения здесь

Вы видите эту строку «Content-Type = application / json; v = 2.0»? На postman проблем нет. С помощью HttpClient из C # это невозможно сделать.

Позвольте мне скопировать сюда все решения, которые я пробовал с ошибкой. Я буду редактировать этот вопрос каждый раз, когда буду пробовать новое решение. По возможности, но также для большей ясности я буду копировать вставлять изображения:

Решение 1: метод расширения с новым содержимым = …

введите описание изображения здесь

Решение 1B: с самого начала

введите описание изображения здесь

Решение 1С: с самого начала, но теперь использует MediaTypeWithQualityHeaderValue

введите описание изображения здесь

Решение 2: метод расширения с запросом.Headers.Add(…)

введите описание изображения здесь

Решение 3: BaseProxy с клиентом.DefaultRequestHeaders .TryAddWithoutValidation (…) Кажется, я не могу добавить какой-либо «Content-Type»

введите описание изображения здесь

Решение 4: BaseProxy с клиентом.DefaultRequestHeaders .Accept.Add(…)

введите описание изображения здесь

Решение 5: запрос.Заголовки.Попробуйте без проверки («Content-Type», «application / json»);

введите описание изображения здесь

Комментарии:

1. вы пробовали атрибут apiVersion?

2. Атрибут apiVersion предназначен для серверной части. Да, все мои API используют [controllerName («Client»)], а затем [apiVersion («2.0»)] аналогичные настройки. Опять же, сервер работает нормально. Я могу отправлять все свои запросы от Postman. Проблема в том, как добавить заголовок с помощью HttpClient?

3. Есть какое-либо решение для этого?

Ответ №1:

Можете ли вы попробовать это?

 request.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue( "application/json" )
{
    Parameters = { new NameValueHeaderValue( "v", "2.0" ) }
};
  

Комментарии:

1. Исключение System.NullReferenceException: «Ссылка на объект не установлена для экземпляра объекта». по запросу. Содержание. Я могу это исправить, но я думаю, что это мое решение 1. Уже протестировано. Можете ли вы перепроверить, видите ли вы какую-либо разницу?

2. вы правильно добавили этот код в свой подход к решению 2?

3. решение 1 на самом деле.

Ответ №2:

Вы не можете (или, по крайней мере, не должны) использовать Content-Type , когда вы не отправляете никакого контента. Используйте Accept заголовок для GET и DELETE запросов, подобных этому:

 request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json; v=2.0"));
  

Если оба заголовка указаны Content-Type , рассматривается ранее Accept . Если Accept указано несколько типов носителей с версией, сопоставляется тот, который имеет наивысшее качество. Смешивание версий для каждого запроса (например, отправка 2.0, но получение 1.0) не поддерживается. Согласование нескольких типов носителей с версией также в настоящее время не поддерживается (помимо качества).