我正在尝试使用 ActionFilter 属性,这样我就可以拦截 OnActionExecuting 事件并在我的 web api 代码中进行 token 验证...下面是一些代码剥离了我的安全性(一个漂亮的样板代码,用于检查 token 是否在具有 Entity Framework 的数据库中):
public class TokenValidationFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var data = new ActionData();
if (filterContext.HttpContext.Request.QueryString.AllKeys.Contains("token"))
{
using (var context = new GNCCustomers())
{
data.GNCToken = context.Tokens.Where(t => t.GNCToken == filterContext.HttpContext.Request["token"]).SingleOrDefault();
if (data.GNCToken == null)
{
filterContext.Result = new HttpUnauthorizedResult("MissingOrInvalidToken") ;
return;
}
}
data.HttpVerb = filterContext.HttpContext.Request.HttpMethod;
foreach (string item in filterContext.HttpContext.Request.QueryString)
{
data.Params.Add(item, filterContext.HttpContext.Request.QueryString[item]);
}
data.Path = filterContext.RouteData.Values;
filterContext.ActionParameters["actionData"] = data;
}
base.OnActionExecuting(filterContext);
}
}
我只是像这样将它应用到我的 Controller 中的一个操作方法:
public class CustomerController : ApiController
{
[HttpPost]
[TokenValidationFilterAttribute]
public HttpResponseMessage Create(ActionData actionData)
{
return Request.CreateResponse(HttpStatusCode.OK);
}...
所以,问题是,如果我在过滤器代码中放置一个断点,在第一行,我们甚至没有遇到断点。我还添加了一些 Debug.Print() stub 来检查我的环境是否有任何问题......没有......代码只是不运行。
那么,有人知道如何处理这个问题吗???我在这里检查解决方案变得疯狂,似乎这个 actionFilters 没有很好的记录。 MSDN 中只有一页,不用多说我已经实现了...
谢谢!非常感谢任何帮助。
问候...
最佳答案
您很可能是从 System.Web.Mvc.ActionFilterAttribute
派生的,而不是从 System.Web.Http.Filters.ActionFilterAttribute
派生的。
第一个来自 ASP.NET MVC,第二个来自 ASP.NET Web API - 你需要第二个,因为你从 ApiController
交付(所以你很可能托管 ASP ASP.NET MVC 应用程序中的 .NET Web API)。
关于c# - 为什么我的 ASP.Net MVC 4 WEB API 操作过滤器在运行时被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13935377/