同样的问题适用于403s.如果我尝试导航到我的应用程序的根目录,我会再次返回403,再次作为网页.我更希望这是一个404,但更大的问题是如何让我的应用程序的所有响应都是JSON而不是只有有效路由的响应?我提到了403,因为我正在寻找一个更广泛的解决方案,而不仅仅是设置一个全能路由,因为我不相信这将帮助我解决403或在控制器动作之外发生的任何其他随机异常.
我希望我的应用程序尊重请求中的接受标头.但是,由于我的API现在只支持JSON,我愿意(暂时)它总是用JSON响应.
我正在使用WebAPI 2.2和.NET 4.5.2.
编辑
这不是格式化程序问题.格式化程序正确应用于成功的消息,尊重请求中的接受标头.这特别是未处理的路由和Web服务器错误(例如在尝试访问Web根目录时被禁止)的问题.
编辑2
重现步骤:
>打开Visual Studio 2013 Update 4
>新项目
>选择.NET Framework 4.5.2
>选择模板> Visual C#>网络> ASP.NET Web应用程序
>选择“清空”,不选中所有文件夹和核心参考.
>右键单击项目>添加>新的脚手架项目> Web API 2控制器 – 空
>修改DefaultController,如下所示.
>修改WebApiConfig.cs,如下所示.
>运行/调试
我期望的是,当我导航到http:// localhost:< port> / 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/error-handling/web-api-global-error-handling