【问题标题】:Why are my ASP.Net MVC4 WEBAPI ActionFilter being ignored at runtime?为什么我的 ASP.Net MVC4 WEBAPI ActionFilter 在运行时被忽略?
【发布时间】:2013-04-29 05:25:26
【问题描述】:

我正在尝试使用 ActionFilter 属性,以便拦截 OnActionExecuting 事件并在我的 Web api 代码中进行令牌验证... 下面是一些代码剥夺了我的安全性(一个漂亮的样板代码,用于检查令牌是否在带有实体框架的数据库中):

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

    }

我只是将它应用到我的控制器上的一种操作方法,如下所示:

public class CustomerController : ApiController
    {
    [HttpPost]        
            [TokenValidationFilterAttribute]
            public HttpResponseMessage Create(ActionData actionData)
            {

                return Request.CreateResponse(HttpStatusCode.OK);
            }...

所以,问题是,如果我在过滤器代码中放置一个断点,在第一行,我们甚至没有命中断点。我还添加了一些 Debug.Print() 存根来检查我的环境是否有任何问题......没什么......代码只是不运行。

那么,任何人都知道如何处理这个问题???我在这里检查解决方案变得疯狂,似乎这个 actionFilters 没有很好的记录。 MSDN 里只有一页,我已经实现的不多说了……

谢谢!非常感谢任何帮助。

问候...

【问题讨论】:

  • 它只在我的开发机器上本地工作。它在 IISExpress 和 Azure Compute Emulator 上运行良好。但是,当在真正的天蓝色环境中发布时,它就是行不通的。检查正确继承的正确代码 tpeczek 波纹管:pastebin.com/CSZeiVA2 我的问题是,似乎从未调用此代码,并且控制器方法中的对象参数“actionData”永远不会被填充,总是返回空......再次,它只发生在 azure 上,而不是在本地 IISExpress 上,也不是在 Azure Compute Emulator 中……有任何线索吗?再次感谢...

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


【解决方案1】:

您很可能是从System.Web.Mvc.ActionFilterAttribute 而不是System.Web.Http.Filters.ActionFilterAttribute 派生的。

第一个来自 ASP.NET MVC,第二个来自 ASP.NET Web API - 你想要第二个,因为你从 ApiController 交付(所以你很可能在里面托管 ASP.NET Web API ASP.NET MVC 应用程序)。

【讨论】:

  • 我希望他们在与 MVC 对应的类同名的类前面加上“Api”。
  • 太棒了!它工作tpeczek!但我强烈同意 Dmitry 的观点,即应该重命名这个废话……
  • @DmitryStarosta - 这就是命名空间的用途。
  • @MystereMan,你是对的。但是考虑到 Visual Studio 本身以及常用的 Resharper 插件都在尝试为你解析命名空间,所以很容易犯这个错误。
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 2013-09-30
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2017-01-15
  • 2013-03-09
相关资源
最近更新 更多