我有一个相当简单的 Web API 应用程序,目前只有一个路由设置。如果用户尝试访问任何其他路由,他们会返回 404,但 404 的主体是 HTML 而不是 JSON(这是他们的 accept header 所要求的)。什么最简单(添加到我的项目中的代码/配置最少)让 IIS 使用 JSON 错误响应而不是网页响应不存在的路由请求?
同样的问题也适用于 403。如果我尝试导航到我的应用程序的根目录,我会返回 403,再次作为网页返回。我希望这是一个 404,但更大的问题是如何让我的应用程序的所有响应成为 JSON 而不是仅响应有效路由?我提到 403 是因为我正在寻找一个更广泛的解决方案,而不仅仅是设置一条包罗万象的路线,因为我认为这不会帮助我解决 403 或在 Controller 操作之外发生的任何其他随机异常。
我希望我的应用程序尊重请求中的接受 header 。但是,由于我的 API 目前仅支持 JSON,因此我愿意(暂时)忍受它始终以 JSON 响应。
我正在使用 WebAPI 2.2 和 .NET 4.5.2。
编辑
这不是格式化程序问题。格式化程序正确应用于成功的消息,尊重请求中的接受 header 。这尤其是未处理的路由和网络服务器错误的问题(例如在尝试访问网络根目录时被禁止)。
编辑2
重现步骤:
- 打开 Visual Studio 2013 Update 4
- 新项目
- 选择 .NET Framework 4.5.2
- 选择模板 > Visual C# > Web > ASP.NET Web 应用程序
- 选择“空”,保留所有文件夹和核心引用未选中。
- 右键单击项目 > 添加 > 新脚手架项 > Web API 2 Controller - 空
- 如下所示修改 DefaultController。
- 如下所示修改 WebApiConfig.cs。
- 运行/调试
我期望的是,当我导航到 http://localhost:<port>/api/do_stuff
时我看到 Success!
在 XML 或 JSON 中取决于接受 header (我这样做),当我导航到任何其他页面时,我应该看到 Failure!
(我没有)。相反,当我导航到任何其他页面时,我会看到 IIS 的 404 响应。
默认 Controller .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
在上面的示例中,当我尝试导航到无效路由或导航到站点根目录时,两者都没有被调用。
最佳答案
从您计划的 catch-all-route 调用下面的函数以返回如下所示的 jsonResult 操作
public JsonResult Handle404()
{
return Json(new { error404 = "NOT FOUND", Message = "Additional Message" });
}
会产生
var result =
{
"error404": "NOT FOUND",
"Message": "Additional Message"
};
alert(result.error404);
allert(result.Message);
关于c# - 如何在 WebAPI 中返回 404 和 403 的 json?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27665998/