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

Я действительно не понимаю, как лучше всего возвращать ответы для моего 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;

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


person Nick Coad    schedule 19.06.2014    source источник


Ответы (3)


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

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

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

person sunil    schedule 19.06.2014
comment
Я написал свой собственный ответ, а затем понял, что он почти идентичен вашему ... Request.CreateResponse действительно меняет его с text / plain на application / json (или, скорее, он использует средство форматирования мультимедиа). Я бы добавил эту ссылку, где нашел ответ: Результаты действий в веб-API 2 - person thinkOfaNumber; 05.09.2014

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

person brumScouse    schedule 19.06.2014

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

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

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

person Community    schedule 19.06.2014