#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.