Asp.net mvc 如何创建默认ActionFilter(OnActionExecuting)并使用属性重写

Asp.net mvc 如何创建默认ActionFilter(OnActionExecuting)并使用属性重写,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,使用ASP.NET MVC4,我希望创建一个操作筛选器属性,如: public class ForceHttps : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) {... 我想要的是将该属性分配给我想要https的控制器,对于所有其他控制器,我想要另一个OnActionExecuting强制Htt

使用ASP.NET MVC4,我希望创建一个操作筛选器属性,如:

 public class ForceHttps : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {...
我想要的是将该属性分配给我想要https的控制器,对于所有其他控制器,我想要另一个OnActionExecuting强制Http。我可以用[ForceNoHttps]装饰其他所有控制器,这也行,但我的首选是将默认值设置为[ForceNoHttps],并且只有在指定[ForceHttps]时,才会执行此方法而不是另一个方法

所以,我希望它执行其中一个,而不是两个。就是

如果{[ForceHttps]在控制器上} 强制页面使用https 其他的 将页面强制为http

有道理吗?我能做这个吗


谢谢

我想你想要的是这样的:

public class NotHttpsAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (request.IsSecureConnection)
        {
            string redirectUrl = filterContext.HttpContext.
                 Request.Url.ToString().Replace("https:", "http:");
            filterContext.HttpContext.Response.Redirect(redirectUrl);
        }
        base.OnActionExecuting(filterContext);
    }
}
这里的问题是,您必须将此筛选器应用于每个非https的控制器/操作

减轻编程负担的一种方法是注册负担,即通过在global.asax中注册NOTHTTP,将其注册到全局过滤器中

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new NotHttpsAttribute()  { Order = 0 });
}

为了确保我理解,您想将某些操作设置为使用https,并确保其他操作不会自动继承?@Peter Kelliner,为什么不使用两个基本控制器作为HttpController和HttpSco控制员,并从HttpController继承所有http控制器,从HttpSco控制员继承所有https控制器。这些HttpController和HttpsController将从Controller继承,您在这里有您的OnActionExecuting overide方法来处理url重定向。Dave,如果我创建一个全局筛选器,我如何使该筛选器“not”在我标记为Https属性的控制器上运行?@PeterKellner,这是一个很好的观点。我想用优先级较低的
[RequireHttps]
来确保is在后面运行,但现在我想起来了,我不能确定全局过滤器的顺序是什么:(@PeterKellner,显然你可以设置全局过滤器的顺序(参见我的编辑)。现在,我怀疑,只要你的
[RequireHttps(order=1)]
始终在…之后运行。。。