Ответ 1
Несколько точек:
Если все, что вам нужно сделать, это вернуть ответ об ошибке, содержащий простое сообщение об ошибке, веб-API предоставляет для этого метод CreateErrorResponse
. Поэтому вы можете просто:
return Request.CreateErrorResponse(HttpStatusCode.BadRequest,
"An error just happened");
Это приведет к следующему HTTP-ответу (другие заголовки опущены для краткости):
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Length: 36
{"Message":"An error just happened"}
Если вы хотите вернуть пользовательский объект вместо этого, вы используете Request.CreateResponse
, как вы делали, но не используете MVC JsonResult
. Вместо этого просто передайте свой объект непосредственно CreateResponse
:
var myError = new
{
Data = "An error just happened",
OtherDetails = "foo bar baz"
};
return Request.CreateResponse(HttpStatusCode.BadRequest, myError);
Теперь скажите, что вы делаете это, но вы не получаете JSON с сервера. Важно понимать, что Web API обычно использует согласование типов контента, чтобы определить, какой формат использовать при отправке ответа. Это означает, что он смотрит на заголовок Accept
, который был отправлен клиентом с запросом. Если заголовок Accept
содержит application/xml
, например, Web API вернет XML. Если заголовок содержит application/json
, тогда он вернет JSON. Итак, вы должны проверить, что ваш клиент отправляет правильный заголовок Accept
.
Тем не менее, есть способы заставить Web API всегда возвращать данные в определенном формате, если это то, что вы действительно хотите. Вы можете сделать это на уровне метода, используя другую перегрузку CreateResponse
, которая также указывает тип содержимого:
return Request.CreateResponse(HttpStatusCode.BadRequest, myError,
new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));
В качестве альтернативы вы можете удалить форматировщик XML из конфигурации в файле WebApiConfig
:
config.Formatters.Remove(config.Formatters.XmlFormatter);
Это заставит веб-API всегда использовать JSON независимо от того, что клиент запрашивает.