我有以下过滤器:
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;
}
}
}
答案 0 :(得分:0)
我认为你需要命名你的属性CPU API AuthorizeAttribute以使其工作。由于一些命名准则 而且只是属于GetPrograms的属性
答案 1 :(得分:0)
为了更好地诊断问题: 当你在GetPrograms()的第一行放置一个断点时,你会点击它吗?
如果不是,则说明您的调试符号未正确加载或您的请求由另一个控制器处理。您可以通过在GetPrograms()的开头抛出一个新的Exception()来轻松确定是哪种情况。
如果你点击了断点,那么下一步就是确定你没有在自定义属性中点击断点的原因。你说你把它放在if语句中,请把断点放在属性的第一行,以排除你没有命中它的原因是因为CPUContext.Current实际上不是null。
答案 2 :(得分:0)
最终解决问题的方法是在Microsoft ASP.Net Web API包上运行nuget更新,并且 - 在这样做后,OnAuthorization方法开始启动。