使用ASP.NET MVC4我想创建一个动作过滤器属性,如:
public class ForceHttps : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{...
我想要的是将该属性分配给我想要https的控制器,而对于所有其他控制器,我想要另一个强制Http的OnActionExecuting。我可以使用[ForceNoHttps]来装饰其他所有控制器,这样可以工作,但我的偏好是默认为[ForceNoHttps]并且只有当我指定[ForceHttps]时才会执行此方法而不执行另一个。
所以,我希望它执行一个或另一个,而不是两个。也就是说,
如果{[ForceHttps]在控制器上} 强制页面为https 其他 强制页面为http
有意义吗?我可以这样做吗?
由于
答案 0 :(得分: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
的每个Controller / Action减轻编程负担的方法是注册你的负担是通过在global.asax中注册NotHttps到全局过滤器。
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new NotHttpsAttribute() { Order = 0 });
}