引言

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

  统计 1  一个啊 简单便捷而异常之 简易跨平台的 纯C开发框架.

    githup上源码  
https://github.com/wangzhione/sconsole\_project

请容我细说 simple c的优势.

  1.适合新手,刚开头盘算开源框架了. 这个框架设计及代码都好

  2.稀缺,C 的开源框架,要么生出名, 难度大, 要么就是从未有过, 这里一定是中左右

    3000 –
5000 行代码量没有过多的网络层,图形层东西,适合语法,逻辑开发层研究.

  3.特意契合在校生, 学习. 刚上的时,用了这框架最开始绉形, 为先生做多少统计分析的

 

再也好之发展, 以私读书经历而言. 在window上比较这框架 学习用更要命自己就觉得

  自制编程语言 那位老牛 写的星星只框架 , 大家可试行

于 linux
, 毕竟linux上完美之开源框架太多了. 前提你能力够好,否则你啊看不懂.

与其看之. 简单还会改造成团结的框架. 

  于斯声明,这个框架随便改, 随便玩, 不介意. 都是公的. 心情好,还足以免费帮助你维护

修复一下.

 

前言

  这个项目刚发出去, 比较简单. 这里会见详细介绍一下.由此细致揣摩, 这个类别支付

中心在window上,测试中心在linux上, 发布侧重点也以linux上.  为什么呢. 容菜鸟我推广一下.

  1. 同等条件下linux程序员 编程水平比较 window程序厉害

    因为linux 的就学成本,研究成本比window高很多, 需要协调折腾好久. 对于同一的知识.

  2. window 上无与伦比深优势是 开发效率高, 很便利的查阅源码. 因为来天地最强IDE VS 旗舰版.

所以总是, 要惦记增强技能,研究linux开发,要想升官工作开效率,用vs. 我这里运用的思路是 使用VS开发

代码最初的demo,后面停放 linux上 详细测试调优. 

扯完了 先看 window 上 simple c 结构

统计 2统计 3

面两单图, 就是终极路支付框架图. 源码见git, 也得做成项目模板. 后面再说了.

关押一下 linux上型框架图

 统计 4

到此基本对之类型发矣大致的摸底了. 下面会细细说明来意的. 

 

正文

  原本想主打linux,后面觉得变化说linux框架NB的不少,unix的框架进一步望其项背. 后面要猥琐一下,在window 上

说说纯C语法开发吧. 下面那就开吧.

 

window 上采取说明

说的还是大白文,走个流程

首先是main 文件夹

  这里要放之是必不可缺运行模块代码,对外用的,测试用底. 上面几乎只test_*.c 代码都是对应的 模块测试代码

后面 readme 文件夹

  help.txt 这里是关于VS2015 使用方面的有的配置

module 是模块代码文件夹

  细分 pthread 模块文件夹

    pthread for window上代码,个人修改了扑,让其会以脚下网上运行

  struct 文件夹

    系统里使用的 数据结构

  schead 文件夹

    保存了开销中的 宏定义, 各种帮助模块,文件,日志,配置, 原子锁等.

说到底的而言框架就这样了. 再细致说 请查看自己先 写的博文 C 基础框架那些库底代码设计

介绍的百般详细.

 

linux 上应用说明

linux上 代码比window精简了很多. 因为linux系统内置很多模块. 从这里还能够收看 linux从性质及比window高效太多矣.

呢就是图上切磋人口少,有接触薄弱. 目前网层linux 优势大. 图形层window优势大.

再有用说的一些凡 linux 上编译步骤需要我们团结一心写. Makefile 文件如下

C = gcc
DEBUG = -g -Wall -D_DEBUG
#指定pthread线程库
LIB = -lpthread -lm
#指定一些目录
DIR = -I./module/schead/include -I./module/struct/include
#具体运行函数
RUN = $(CC) $(DEBUG) -o $@ $^ $(LIB) $(DIR)
RUNO = $(CC) $(DEBUG) -c -o $@ $^ $(DIR)

# 主要生成的产品
all:test_cjson_write.out test_csjon.out test_csv.out test_json_read.out test_log.out\
 test_scconf.out test_tstring.out

#挨个生产的产品
test_cjson_write.out:test_cjson_write.o schead.o sclog.o tstring.o cjson.o
    $(RUN)
test_csjon.out:test_csjon.o schead.o sclog.o tstring.o cjson.o
    $(RUN)
test_csv.out:test_csv.o schead.o sclog.o sccsv.o tstring.o
    $(RUN)
test_json_read.out:test_json_read.o schead.o sclog.o sccsv.o tstring.o cjson.o
    $(RUN)
test_log.out:test_log.o schead.o sclog.o
    $(RUN)
test_scconf.out:test_scconf.o schead.o scconf.o tree.o tstring.o sclog.o
    $(RUN)
test_tstring.out:test_tstring.o tstring.o sclog.o schead.o
    $(RUN)

#产品主要的待链接文件
test_cjson_write.o:./main/test_cjson_write.c
    $(RUNO)
test_csjon.o:./main/test_csjon.c
    $(RUNO)
test_csv.o:./main/test_csv.c
    $(RUNO)
test_json_read.o:./main/test_json_read.c
    $(RUNO)
test_log.o:./main/test_log.c 
    $(RUNO) -std=c99
test_scconf.o:./main/test_scconf.c
    $(RUNO)
test_tstring.o:./main/test_tstring.c
    $(RUNO)

#工具集机械码,待别人链接
schead.o:./module/schead/schead.c
    $(RUNO)
sclog.o:./module/schead/sclog.c
    $(RUNO)
sccsv.o:./module/schead/sccsv.c
    $(RUNO)
tstring.o:./module/struct/tstring.c
    $(RUNO)
cjson.o:./module/schead/cjson.c
    $(RUNO)
scconf.o:./module/schead/scconf.c
    $(RUNO)
tree.o:./module/struct/tree.c
    $(RUNO)

#删除命令
clean:
    rm -rf *.i *.s *.o *.out __* log ; ls -hl
.PHONY:clean

起达望生念,很基础,因为我之Makefile 学的大基础. 先编译什么,依赖什么. 这样把这类型编译起来了. 大家试试. 发布的时刻 去丢-D_DEBUG 就好了.

想念更说一样碰, 我们于window和linux上协同工作的时,常遇编码问题.

缓解方案

  window上编译器 IDE 采用英文环境 默认 utf-8

  linux 采用 enca 很好用, 怎么设置, 自己google 一下.

顶此地小累了,不思细说了. 就如此吧. 说的更多, 也说不清楚所有…………………………

 

后记

  错误是在所难免的,欢迎吐槽…

以此框架下,是拖欠写一勾好游戏的东西. 有时机享受几只建议之游玩开发. 以后有机遇准备享受部分. 下一个号起会还享受部分网络库和数据库开发的知识.

bye…统计 5