c# - 为什么我的 ASP.Net MVC 4 WEB API 操作过滤器在运行时被忽略?

标签 c# asp.net-mvc asp.net-mvc-4 asp.net-web-api

我正在尝试使用 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/

相关文章:

javascript - 如何从 JSon 方法接收数据?

c# - 清理发往电子邮件的用户输入

javascript - 是否可以在 ASP.NET MVC4 中使用一个 Controller 函数在 View 中返回两个数组?

asp.net-mvc - 在 MVC Web API 应用程序中进行跟踪

c# - 为视频生成缩略图

c# - 是否可以在方法内部运行函数?

c# - 将变量分配给 lambda 表达式的结果

asp.net - 导出Excel前添加标题

c# - C#中的位运算。如何将 2 long 转换为 bool 结果?

c# - Entity Framework 生成的类的正确使用(数据库优先方法)