Настройка типа содержимого для ответа Web API 2

#c# #asp.net #asp.net-mvc #asp.net-web-api2

#c# #asp.net #asp.net-mvc #asp.net-web-api2

Вопрос:

Я действительно смущен наиболее подходящим способом возврата ответов для моего RESTful API, который я создаю с использованием Web API 2.

Сначала я вернул свои действия IHttpActionResult и в методе, который я бы использовал return Ok() или return NotFound() и т. Д.

Затем я обнаружил, что нет Forbidden() , поэтому я подумал, что, должно быть, что-то делаю неправильно. Итак, теперь я возвращаю свои действия HttpResponseMessage . В моем коде я возвращаю ответ, выполняя следующие действия:

 HttpResponseMessage response = Request.CreateResponse();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StringContent(JsonConvert.SerializeObject(responseData));
return response;
 

Проблема в том, что этот ответ теперь отправляется с типом содержимого «текст / обычный» — его необходимо отправлять с типом содержимого «application / json». Я не могу найти, как я должен изменять тип содержимого ответа, но даже если бы я мог, это кажется громоздким делать это с каждым запросом. Это лучший способ, какая-то лучшая практика, которую я здесь упускаю из виду?

Ответ №1:

Вместо того, чтобы заполнять его вручную, вы можете сделать это

 var response = Request.CreateResponse(HttpStatusCode.OK, responseData);
return response;
 

Это, это вернет тип содержимого как json.

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

1. Я написал свой собственный ответ, а затем понял, что он почти идентичен вашему… Запрос. CreateResponse действительно изменяет его с text / plain на application / json (или, скорее, он использует форматирование мультимедиа). Я бы добавил эту ссылку, где я нашел ответ: результаты действия в Web API 2

Ответ №2:

Вы можете настроить согласование содержимого для каждого запроса, изменив коллекцию в global.asax

Ответ №3:

Установили ли вы JsonFormatter в вашем global.asax? Например:

 GlobalConfiguration.Configuration.EnsureInitialized();
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
 

Еще одна проблема, которую я обнаружил, заключается в том, что ваш префикс / маршрут маршрутизации с подписью параметров на вашем контроллере не может совпадать с URL, который вы передаете, предоставляя обычно код 404.