将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上看似不完整的文档。
我甚至认为这是正确的方法吗?
感谢任何指导。
答案 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>