asp.net mvc RequireLocalHostActionFilter没有激活

时间:2011-04-21 18:36:32

标签: asp.net-mvc-3

我试图实现Phil Haack在他的一个节目中所做的RequireLocalHostActionFilter。

它的ActionFilter检查对give方法的调用是否来自本地主机,并在全局过滤器中注册。

但我的过滤器无法正常工作,我无法理解它。

所以,如果有人有空闲时间看看,请。

我的ActionFilter:

public class RequireLocalHostActionFilter : AuthorizeAttribute
{

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return !httpContext.Request.IsLocal; // I need to test on the local host, so I reverse the logic.
    }

}

我的FilterProvider

public class ConditionalFilterProvider : IFilterProvider
{
    public readonly IEnumerable<Func<ControllerContext, ActionDescriptor, object>> _conditions;

    public ConditionalFilterProvider(IEnumerable<Func<ControllerContext, ActionDescriptor, object>> conditions)
    {
        this._conditions = conditions;
    }

    public IEnumerable<Filter>  GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        IEnumerable<Filter> result = from condition in _conditions
               select condition(controllerContext, actionDescriptor)
               into filter
               where filter != null
               select new Filter(filter, FilterScope.Global, null);
        return result;
    }

}

在全局中。

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        var conditions = new Func<ControllerContext, ActionDescriptor, object>[]
                            {
                                (c, a) => 
                                    a.ControllerDescriptor.ControllerName.Equals("Online", StringComparison.OrdinalIgnoreCase)
                                    ? null : new RequireLocalHostActionFilter()
                            };

        filters.Add(new ConditionalFilterProvider(conditions));
        filters.Add(new HandleErrorAttribute());
    }

我可以看到动作过滤器被添加到过滤器集合中。 最后我的OnlineController,一个simpel控件,我希望全局过滤器能够启动。

    public class OnlineController : Controller
{

    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC! online";

        return View();  
    }

// thx花时间阅读这篇文章。 //丹尼斯

1 个答案:

答案 0 :(得分:1)

我的if语句需要颠倒。

var conditions = new Func < ControllerContext,
  ActionDescriptor, object > [] {
   (c, a) =>
   a.ControllerDescriptor.ControllerName.Equals("Online",
    StringComparison.OrdinalIgnoreCase) * * ? new RequireLocalHostActionFilterAttribute() : null * *
  };

我忘了将过滤器添加到控制器的顶部。

// dennis