Web API 自定义过滤器/属性未触发

Web API Custom Filter / Attribute Not Firing

我有以下过滤器:

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);
    }
}

应用于以下网络api方法:

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

但是,如果我在 if (CPUContext.Current == null) 中放置一个断点,它不会捕获,这让我相信该属性不会触发。

我还注意到我的自定义 ExceptionHandling 属性没有触发,我可以删除所有属性,网络 api 方法将起作用。而在过去,我需要有 HttpGet 属性,否则该方法将不会执行。

我不知道为什么 filters/attributes 没有开火。

什么是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;
        }
    }
}

我认为您需要将属性 CPU API 命名为 AuthorizeAttribute 才能使其工作。由于一些命名准则 只是 GetPrograms

上的属性

为了更好地诊断问题: 当您在 GetPrograms() 的第一行放置断点时,您是否命中它?

如果不是,那么要么是你的调试符号没有正确加载,要么是你的请求被另一个控制器处理了。您可以通过在 GetPrograms() 的开头抛出一个新的 Exception() 来轻松确定是哪种情况。

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

最终解决问题的是 运行 Microsoft ASP.Net Web API 包上的 nuget 更新和 - 这样做之后,OnAuthorization 方法开始触发。