为AJAX调用Web API返回“除HTML以外”格式的错误

时间:2012-04-11 19:01:07

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

将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上看似不完整的文档。

我甚至认为这是正确的方法吗?

感谢任何指导。

2 个答案:

答案 0 :(得分: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 :(得分:0)

我非常喜欢Marcin的回答 - 最后,他写了代码!

我要补充的是,正如Marcin所说,最好的办法是让专用控制器根据需要返回错误 - 而不是在属性中设置带有JSON内容的响应代码401 。

主要原因是Web API为您执行内容协商,如果您想自己执行(看看您是否需要提供JSON或HTML),则会失去所有功能。< / p>