Как мне вернуть JSON для 404 и 403 в WebAPI?C#

Место общения программистов C#
Ответить
Anonymous
 Как мне вернуть JSON для 404 и 403 в WebAPI?

Сообщение Anonymous »

У меня есть довольно простое приложение веб-API, в котором в настоящее время настроен один маршрут. Если пользователь пытается получить доступ к любому другому маршруту, он получает ответ 404, но тело 404 представляет собой HTML, а не JSON (именно это и требует заголовок принятия). Каков самый простой (с наименьшим количеством кода/конфигурации, добавленный в мой проект) способ заставить IIS отвечать на запросы несуществующих маршрутов ответом об ошибке JSON, а не веб-страницей?

Тот же вопрос применим и к ошибкам 403. Если я попытаюсь перейти к корню моего приложения, я снова получу ошибку 403, снова в виде веб-страницы. Я бы предпочел, чтобы это был код 404, но более важный вопрос заключается в том, как мне сделать так, чтобы все ответы моего приложения были в формате JSON, а не только ответы на действительных маршрутах? Я упоминаю 403, потому что ищу более широкое решение, чем просто настройка всеобъемлющего маршрута, поскольку я не верю, что это поможет мне с 403 или любым другим случайным исключением, которое возникает вне действия контроллера.

Предпочтительно, чтобы мое приложение уважало заголовок принятия запроса. Однако, поскольку мой API сейчас поддерживает только JSON, я готов (пока) жить с тем, чтобы он всегда отвечал в формате JSON.

Я использую WebAPI 2.2 и .NET 4.5.2.

Редактировать

Это не проблема форматтера. Средства форматирования корректно применяются к успешным сообщениям с учетом заголовка принятия в запросе. В частности, это проблема необработанных маршрутов и ошибок веб-сервера (например, запрет при попытке доступа к корневому каталогу веб-сайта).

Изменить 2

Шаги для воспроизведения:
  • Открыть Visual Studio 2013, обновление 4
  • Новый проект
  • Выбрать .NET Framework 4.5.2
  • Выберите «Шаблоны» > «Visual C#» > «Интернет» > «Веб-приложение ASP.NET».
  • Выберите «Пусто», оставьте все папки и основные ссылки неотмеченными.
  • Щелкните проект правой кнопкой мыши > «Добавить» > «Новый элемент шаблона» > «Контроллер Web API 2 — пустой».
  • Измените DefaultController как показано ниже.
  • Измените WebApiConfig.cs, как показано ниже.
  • Запустите/Отладку
Я ожидаю, что когда я перейду к http://localhost:
/api/do_stuff, я увижу Успех! в XML или JSON в зависимости от заголовков принятия (что я и делаю), и когда я перейду на любую другую страницу, я должен увидеть Провал! (чего я не делаю). Вместо этого, когда я перехожу на любую другую страницу, я вижу ответ IIS 404.

DefaultController.cs:

Код: Выделить всё

[RoutePrefix("api")]
public class DefaultController : ApiController
{
[HttpGet]
[Route("do_stuff")]
public String DoStuff()
{
return "Success!";
}
}
WebApiConfig.cs:

Код: Выделить всё

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Filters.Add(new CustomExceptionFilter());
}

private class CustomExceptionFilter : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response.StatusCode == System.Net.HttpStatusCode.NotFound)
{
actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NotFound)
{
Content = new StringContent(@"""Failure!"""),
};
}
}
}
}
Изменить 3

Я также попробовал добавить глобальный обработчик исключений и регистратор исключений, как показано здесь:
http://www.asp.net/web-api/overview/err ... r-handling

Ни один из них не вызывается, когда я пытаюсь перейти по недопустимому маршруту или перейти на сайт. root в приведенном выше примере.

Подробнее здесь: https://stackoverflow.com/questions/276 ... -in-webapi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»