ASP.NET MVC Action Filters中有趣的Http Headers

ASP.NET MVC Action Filters中有趣的Http Headers

        你想要你的Asp.net mvc 应用程序在一段时间后自动重定向一个指定的URL,是的你能用javascript中window.location来实现,除了javascript外呢?看这个代码:

  1. [AutoRefresh(ControllerName = "Home", ActionName = "About", DurationInSeconds = 10)]   
  2. public ActionResult Index1()   
  3.   
  4. [AutoRefresh(ActionName = "About", DurationInSeconds = 15)]   
  5. public ActionResult Index2()   
  6.   
  7. [AutoRefresh(RouteName = "ByFavoriteRoute", DurationInSeconds = 30)]   
  8. public ActionResult Index3()   
  9.   
  10. [AutoRefresh(DurationInSeconds = 45)]   
  11. public ActionResult Index4()  
[AutoRefresh(ControllerName = "Home", ActionName = "About", DurationInSeconds = 10)]
public ActionResult Index1()

[AutoRefresh(ActionName = "About", DurationInSeconds = 15)]
public ActionResult Index2()

[AutoRefresh(RouteName = "ByFavoriteRoute", DurationInSeconds = 30)]
public ActionResult Index3()

[AutoRefresh(DurationInSeconds = 45)]
public ActionResult Index4()

如果浏览器在特定期间是闲置的,它将自动重定向到那个Action.如果你不指定任何action/controller/route,它将自动重定向当前URL.怎样?好的我只是使用/滥用一些http header,来看下面:

  1. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]   
  2. [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]   
  3. public class AutoRefreshAttribute : ActionFilterAttribute   
  4. {   
  5.     public const int DefaultDurationInSeconds = 300; // 5 Minutes   
  6.   
  7.     public AutoRefreshAttribute()   
  8.     {   
  9.         DurationInSeconds = DefaultDurationInSeconds;   
  10.     }   
  11.   
  12.     public int DurationInSeconds   
  13.     {   
  14.         get;   
  15.         set;   
  16.     }   
  17.   
  18.     public string RouteName   
  19.     {   
  20.         get;   
  21.         set;   
  22.     }   
  23.   
  24.     public string ControllerName   
  25.     {   
  26.         get;   
  27.         set;   
  28.     }   
  29.   
  30.     public string ActionName   
  31.     {   
  32.         get;   
  33.         set;   
  34.     }   
  35.   
  36.     public override void OnResultExecuted(ResultExecutedContext filterContext)   
  37.     {   
  38.         string url = BuildUrl(filterContext);   
  39.         string headerValue = string.Concat(DurationInSeconds, ";Url=", url);   
  40.   
  41.         filterContext.HttpContext.Response.AppendHeader("Refresh", headerValue);   
  42.   
  43.         base.OnResultExecuted(filterContext);   
  44.     }   
  45.   
  46.     private string BuildUrl(ControllerContext filterContext)   
  47.     {   
  48.         UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);   
  49.         string url;   
  50.   
  51.         if (!string.IsNullOrEmpty(RouteName))   
  52.         {   
  53.             url = urlHelper.RouteUrl(RouteName);   
  54.         }   
  55.         else if (!string.IsNullOrEmpty(ControllerName) && !string.IsNullOrEmpty(ActionName))   
  56.         {   
  57.             url = urlHelper.Action(ActionName, ControllerName);   
  58.         }   
  59.         else if (!string.IsNullOrEmpty(ActionName))   
  60.         {   
  61.             url = urlHelper.Action(ActionName);   
  62.         }   
  63.         else  
  64.         {   
  65.             url = filterContext.HttpContext.Request.RawUrl;   
  66.         }   
  67.   
  68.         return url;   
  69.     }   
  70. }  
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
public class AutoRefreshAttribute : ActionFilterAttribute
{
    public const int DefaultDurationInSeconds = 300; // 5 Minutes

    public AutoRefreshAttribute()
    {
        DurationInSeconds = DefaultDurationInSeconds;
    }

    public int DurationInSeconds
    {
        get;
        set;
    }

    public string RouteName
    {
        get;
        set;
    }

    public string ControllerName
    {
        get;
        set;
    }

    public string ActionName
    {
        get;
        set;
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        string url = BuildUrl(filterContext);
        string headerValue = string.Concat(DurationInSeconds, ";Url=", url);

        filterContext.HttpContext.Response.AppendHeader("Refresh", headerValue);

        base.OnResultExecuted(filterContext);
    }

    private string BuildUrl(ControllerContext filterContext)
    {
        UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);
        string url;

        if (!string.IsNullOrEmpty(RouteName))
        {
            url = urlHelper.RouteUrl(RouteName);
        }
        else if (!string.IsNullOrEmpty(ControllerName) && !string.IsNullOrEmpty(ActionName))
        {
            url = urlHelper.Action(ActionName, ControllerName);
        }
        else if (!string.IsNullOrEmpty(ActionName))
        {
            url = urlHelper.Action(ActionName);
        }
        else
        {
            url = filterContext.HttpContext.Request.RawUrl;
        }

        return url;
    }
}

不能想像适当使用这个action filter,可能你能在你你要显示一些在线统计之类页面任何iframe中使用它.好的,现在让我们试试滥用这个Refeash header,这时它是一个相当通的场景.

你要安全的使用(标记为已认证)action,当会话过期时自动重定向到登陆页面.现试试这个:

  1. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]   
  2. [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]   
  3. public class AutoRedirecToLogin : ActionFilterAttribute   
  4. {   
  5.     public override void OnResultExecuted(ResultExecutedContext filterContext)   
  6.     {   
  7.         string url = FormsAuthentication.LoginUrl;   
  8.         int durationInSeconds = ((filterContext.HttpContext.Session.Timeout * 60) + 10); // Extra 10 seconds   
  9.   
  10.         string headerValue = string.Concat(durationInSeconds, ";Url=", url);   
  11.   
  12.         filterContext.HttpContext.Response.AppendHeader("Refresh", headerValue);   
  13.   
  14.         base.OnResultExecuted(filterContext);   
  15.     }   
  16. }  
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
public class AutoRedirecToLogin : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        string url = FormsAuthentication.LoginUrl;
        int durationInSeconds = ((filterContext.HttpContext.Session.Timeout * 60) + 10); // Extra 10 seconds

        string headerValue = string.Concat(durationInSeconds, ";Url=", url);

        filterContext.HttpContext.Response.AppendHeader("Refresh", headerValue);

        base.OnResultExecuted(filterContext);
    }
}

当会话过期时,不需要额外的用户点击它将自动重定向到登陆页面.

警告:如果你要你的URL被搜索引擎收录为索引,那以不要使用Refresh meta 头(验证过Google,其它的不确定).例如,你的页面A要自动重定向页面B,那么页面A只有这个头,在那种情况下页面A将不会被索引.

Roni Schuetz 刚通知他有一个聚集 mvc action filters的项目在CodePlex 上, 对于他的项目这两个应该是最佳候选.

Author: Petter Liu   http://wintersun.cnblogs.com       Source

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值