Web API自定义筛选器/属性未触发

时间:2015-01-25 16:41:53

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

我有以下过滤器:

public class CPUAPIAuthorize : AuthorizationFilterAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (CPUContext.Current == null)
        {
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
            return;
        }

        base.OnAuthorization(actionContext);
    }
}

应用于以下web api方法:

[HttpGet]
[CPUAPIAuthorize]
[ExceptionHandling]
public dynamic GetPrograms()
{
   .... removed ....
}

但是,如果我在if (CPUContext.Current == null)中设置了一个断点,那么它就会让我相信该属性不会被触发。

我还注意到我的自定义ExceptionHandling属性没有被触发,我可以删除所有属性,并且web api方法将起作用。在过去,我需要在那里拥有HttpGet属性,否则方法将无法执行。

我不知道过滤器/属性为什么不会被解雇。

什么是CPUContext.Current?

为了帮助澄清,CPUContext.Current保存当前登录的用户..这是方法。我在其他项目中使用相同的设置,这些项目与上述属性一起工作正常。

public static class CPUContext
{
    public static CommunityPartnerUser Current
    {
        get
        {
            if (!HttpContext.Current.Items.Contains("_currentCPU"))
            {
                HttpContext.Current.Items.Add("_currentCPU", Authentication.AuthenticateCPUser());
            }

            return HttpContext.Current.Items["_currentCPU"] as CommunityPartnerUser;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

我认为你需要命名你的属性CPU API AuthorizeAttribute以使其工作。由于一些命名准则 而且只是属于GetPrograms的属性

答案 1 :(得分:0)

为了更好地诊断问题: 当你在GetPrograms()的第一行放置一个断点时,你会点击它吗?

如果不是,则说明您的调试符号未正确加载或您的请求由另一个控制器处理。您可以通过在GetPrograms()的开头抛出一个新的Exception()来轻松确定是哪种情况。

如果你点击了断点,那么下一步就是确定你没有在自定义属性中点击断点的原因。你说你把它放在if语句中,请把断点放在属性的第一行,以排除你没有命中它的原因是因为CPUContext.Current实际上不是null。

答案 2 :(得分:0)

最终解决问题的方法是在Microsoft ASP.Net Web API包上运行nuget更新,并且 - 在这样做后,OnAuthorization方法开始启动。