2

将 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 上的文档。

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

将不胜感激任何指导。

4

2 回答 2

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;
}
于 2012-04-11T19:21:30.953 回答
0

我非常愿意接受 Marcin 的回答——归根结底,他已经编写了代码!

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

主要原因是 Web API为您进行内容协商,如果您想自己做(看看您是否需要提供 JSON 或 HTML),您将失去所有这些功能。

于 2012-04-11T21:37:46.843 回答