c# - 如何在 WebAPI 中返回 404 和 403 的 json?

标签 c# asp.net asp.net-web-api

我有一个相当简单的 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

重现步骤:

  1. 打开 Visual Studio 2013 Update 4
  2. 新项目
  3. 选择 .NET Framework 4.5.2
  4. 选择模板 > Visual C# > Web > ASP.NET Web 应用程序
  5. 选择“空”,保留所有文件夹和核心引用未选中
  6. 右键单击项目 > 添加 > 新脚手架项 > Web API 2 Controller - 空
  7. 如下所示修改 DefaultController。
  8. 如下所示修改 WebApiConfig.cs。
  9. 运行/调试

我期望的是,当我导航到 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/

相关文章:

javascript - 如何发送TCP保持事件数据包

c# - 命名空间 'Standard' 是什么?

c# - 将iTunes商店中的Json反序列化为C#对象

c# - Linq:连接中的 == 和 equals 有什么区别?

c# - 在 SSRS 的重复列表对象中包含动态子报表

c# - 自定义错误重定向不起作用

asp.net - Azure应用程序服务-如何使Always On适用于特定应用程序?

c# - JWT 授权重定向到登录

javascript - 上传前在客户端调整图片大小

asp.net - modalpopupextender 取消按钮就像在回发一样工作