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 方法开始触发。
我有以下过滤器:
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 方法开始触发。