【问题标题】:Returning 'other than HTML' formatted errors for AJAX calls to Web API为对 Web API 的 AJAX 调用返回“非 HTML”格式错误
【发布时间】:2012-04-24 03:06:31
【问题描述】:

将 Web API 作为 MVC 4 项目的一部分进行调查,作为提供基于 AJAX 的 API 的替代方法。我为 MVC 控制器扩展了 AuthorizeAttribute,这样,如果检测到 AJAX 请求,就会返回 JSON 格式的错误。 Web API 以 HTML 形式返回错误。这是我与 MVC 控制器一起使用的 AuthorizeAttribute:

public class AuthorizeAttribute: System.Web.Mvc.AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);

        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary 
            {
                { "area", "" },
                { "controller", "Error" },
                { "action", ( filterContext.HttpContext.Request.IsAjaxRequest() ? "JsonHttp" : "Http" ) },
                { "id", "401" },
            });
    }
}

我怎样才能重现它来为 Web API 提供等效的功能?

我意识到我需要扩展 System.Web.Http.AuthorizeAttribute 而不是 System.Web.Mvc.AuthorizeAttribute 但这使用的是 HttpActionContext 而不是 AuthorizationContext,因此我对 Web API 的了解有限和MSDN 上看似不完整的文档。

我认为这将是正确的方法是否正确?

不胜感激。

【问题讨论】:

    标签: ajax json asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    要在 Web API 过滤器中获得等效功能,您可以将 HttpActionContext.Response 属性设置为具有正确重定向状态代码和位置标头的 HttpResponseMessage 实例:

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) {
        var response = new HttpResponseMessage(HttpStatusCode.Redirect);
        response.Headers.Location = new Uri("my new location");
        actionContext.Response = response;
    }
    

    【讨论】:

    • +1。我只是写了几行来进一步解释你的解释。觉得编辑你的答案是不礼貌的。
    • @Aliostad 你有 SO 代表,使用权力。我不会介意(只要它是好的信息:)
    • 干杯。我添加了另一个答案,并提供了更多解释。
    【解决方案2】:

    我非常赞同 Marcin 的回答 - 归根结底,他已经编写了代码!

    我要补充的是,正如 Marcin 所说,您最好的选择是拥有一个专用控制器来酌情返回 错误 - 而不是在属性中使用 JSON 内容设置响应代码 401 .

    主要原因是 Web API 为您执行 content-negotiation,如果您想自己执行(查看是否需要提供 JSON 或 HTML),您将失去所有这些功能。

    【讨论】:

      猜你喜欢
      • 2013-10-01
      • 2014-08-07
      • 2017-04-23
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2018-04-28
      相关资源
      最近更新 更多