Тот же вопрос применим и к ошибкам 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, как показано ниже.
- Запустите/Отладку
/api/do_stuff, я увижу Успех! в XML или JSON в зависимости от заголовков принятия (что я и делаю), и когда я перейду на любую другую страницу, я должен увидеть Провал! (чего я не делаю). Вместо этого, когда я перехожу на любую другую страницу, я вижу ответ IIS 404.
DefaultController.cs:
Код: Выделить всё
[RoutePrefix("api")]
public class DefaultController : ApiController
{
[HttpGet]
[Route("do_stuff")]
public String DoStuff()
{
return "Success!";
}
}
Код: Выделить всё
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!"""),
};
}
}
}
}
Я также попробовал добавить глобальный обработчик исключений и регистратор исключений, как показано здесь:
http://www.asp.net/web-api/overview/err ... r-handling
Ни один из них не вызывается, когда я пытаюсь перейти по недопустимому маршруту или перейти на сайт. root в приведенном выше примере.
Подробнее здесь: https://stackoverflow.com/questions/276 ... -in-webapi
Мобильная версия