2

使用 ASP.NET MVC4 我想创建一个动作过滤器属性,如:

 public class ForceHttps : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {...

我想要的是将该属性分配给我想要 https 的控制器,对于所有其他控制器,我想要另一个强制 Http 的 OnActionExecuting。我可以用 [ForceNoHttps] 装饰所有其他控制器,这会起作用,但我的偏好是默认设置为 [ForceNoHttps] 并且只有当我指定 [ForceHttps] 时才会执行此方法而不是其他方法。

所以,我希望它执行一个或另一个,而不是两者。那是,

if {[ForceHttps] is on controller} 强制页面为 https else 强制页面为 http

说得通?我可以这样做吗?

谢谢

4

1 回答 1

1

我认为你想要的是这样的:

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 中注册 NotHttps 使其成为全局过滤器。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new NotHttpsAttribute()  { Order = 0 });
}
于 2013-05-04T03:21:53.703 回答