#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) не поддерживается. Согласование нескольких типов носителей с версией также в настоящее время не поддерживается (помимо качества).