ASP.NET MVC 中解决Session,Cookie等依赖的方式
目录
介绍
使用Filter方式
Filter在MVC生命周期中的位置
Filter常见的应用场景
Filter的执行顺序
MVC中常见的对Session,Cookie的依赖
使用Filter解除依赖
使用Model Binding方式
什么是Model Binding?
自定义Model Binding
总结
介绍
本文将分别介绍在MVC中使用Filter和Model Binding两种方式来说明如何解除对Session,Cookie等的依赖。当然也会适当对Filter在MVC请求的生命周期中的作用和角色,使用场景等作下简单的说明。
使用Filter方式
Filter在MVC生命周期中的位置
如上图所示,一个完成的MVC的生命周期分为5个步骤, 对应图例中的1~5。
- IIS中传递请求到程序
- MVC根据Routing来选择由哪个Controller/Action来处理
- Controller调用Model(业务逻辑)来处理数据
- Controller选择一个View, 同时把需要呈现的数据交给View Engine呈现
- 最后,返回最终的Response到客户端
Filter在MVC的生命周期中的角色就像是一个一个的截面,在MVC的处理过程中,拦截请求。
Filter分为:
Authorization filters——需要实现IAuthorizationFilter接口,用于验证处理验证相关的操作
Action filters——需要实现IActionFilter接口. 在Action处理的开始和结束做拦截操作
Result filters——需要实现IResultFilter接口. 在View呈现前和呈现后做处理
Exception filters——需要实现IExceptionFilter接口,只要是添加了Exception Filter的请求中出现异常,都会被拦截
每个Filter的作用时机,对应于上图中的2a, 2b, 4a, 4b。
Filter常见的应用场景
下面是个人在开发中,常用到的Filter处理:
- 权限验证
使用Authorization filters,拦截请求,在进入到Controller处理之前,验证用户是否登录或者登录用户是否有权限访问改页面。
如果合法,就继续交由Controller处理,如果非法,中断流程,跳转到登录页面。
- 日志记录
通过Action Filter跟踪记录Action处理开始的时间,结束时间,访问的具体Controller和Action, 参数,访问者ip等信息。
- 异常处理
异常处理Exception filter能够在发生异常的时候,记录异常信息。如果是session过期引起的异常,则跳转到登录页面,如果是程序运行导致的无法处理异常,则跳转到友好的错误页面。
- 提升SEO效果
每篇博客文章的meta信息能够帮助提高SEO效果,但是很多人对于填写keyword, description等信息觉得太繁琐。
可以使用Result filters,在最后呈现页面前,使用程序分析内容,提取keyword和description来,然后填充到meta信息中。
这样,每篇博客文章都能够有程序实现最佳的SEO效果,甚至生成一份SEO报告出来。
Filter的执行顺序
Filter之间执行的顺序,首先根据类型区分:
分别是Authorization filters, Action filters, Result filters。Exception Filter没有列入的原因是, 它是在发生异常的时候处理,没有特定的顺序。
当同时对一个类型的Filter的时候,执行顺序可以通过Filter的Order属性来排序。
MVC中常见的对Session,Cookie的依赖
在Web程序中,对于Session和Cookie等的使用是必不可少的。比如, 很多的Action的代码中,会要从Session中获取当前登录用户信息:
public ActionResult Index()
{var user = Session[“UserAccuont”];//从Session中获取当前登录用户的信息//send emailvar email = user.Email;…………
}
上面的Index方法的问题就是和Session耦合,很难单元测试。下面介绍如何使用Filter来解除对于Session的依赖。
使用Filter解除依赖
添加一个SessionUserParameterAttribute的Action Filter, 它的功能是:
从Session中取得User, 将取得的User赋值给Action中的参数sessionUser。
public class SessionUserParameterAttribute : ActionFilterAttribute
{public override void OnActionExecuting(ActionExecutingContext filterContext){const string key = "sessionUser";if (filterContext.ActionParameters.ContainsKey(key)){filterContext.ActionParameters[key] = Session[“UserAccuont”];//为Action设置参数}base.OnActionExecuting(filterContext);}
}
改造后的Index Action方法如下:
[SessionUserParameter]
public ActionResult Index(UserAccount sessionUser)
{//send emailvar email = sessionUser.Email;…………
}
这样Index方法就解除了对于Session的依赖,而只是依赖于一个普通的实体类UserAccount。在单元测试中,只需要简单的构造一个UserAccount的对象就可以了。
使用Model Binding方式
什么是Model Binding?
Model Binding的作用就是将Request请求中包含的散乱参数,根据接受请求的Action方法的参数列表,自动智能地构建这些参数的过程。
自定义Model Binding
继承接口IModelBinder, 实现BindModel方法。
这个UserAccountModelBinder的作用就是从Session中取得UserAccount。(问题和Filter中提到的问题相同)
public class UserAccountModelBinder : IModelBinder{public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){if(controllerContext.HttpContext.Session["UserAccuont"] != null){return controllerContext.HttpContext.Session["UserAccuont"];}return null;}}
接下来,我们要为这个ModelBinder,添加到MVC的Model Binding设置中,使得它能够在MVC的生命周期中起作用。
在Global.asax.cs文件的Application_Start()方法中,添加UserAccountModelBinder。
protected void Application_Start()
{………//凡是UserAccount类型的参数,都会使用UserAccountModelBinder来处理,也就是会从Session中取值ModelBinders.Binders.Add(typeof(UserAccount), new UserAccountModelBinder ());}
改造后的Index方法如下:
public ActionResult Index(UserAccount sessionUser)
{//send emailvar email = sessionUser.Email;…………
}
上面就是全部的Model Binding解决问题的过程,希望能够帮助大家更好地理解MVC中的Model Binding。
总结
本文主要介绍了MVC中两种解决对Session,Cookie等依赖的方式,这两种方式可根据自己项目的需求具体选择使用哪种。其中Filter还有其他一些场景的使用,有兴趣的小伙伴也可以自己多多探索。
ASP.NET MVC 中解决Session,Cookie等依赖的方式相关推荐
- [MVC]Asp.net MVC中的Session
[MVC]Asp.net MVC中的Session 2008年12月9日 分类: ASP.NET, ASP.NET MVC, C#, 开发笔记 最近使用ASP.NET MVC 中的Controller ...
- ASP.NET MVC中controller和view相互传值的方式
ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...
- ASP.NET MVC中使用Autofac实现简单依赖注入
本文参考资料: 1.https://www.cnblogs.com/RayWang/p/11128554.html. 2.https://www.cnblogs.com/eedc/p/6127181. ...
- ASP.NET MVC项目 解决session失效
Web.config配置文件 在Web.config配置文件中,通过sessionState节点上的mode属性设置 mode值共分为5种: 1.InProc: mode默认值,只是保存当前应用程序域 ...
- Asp.net MVC使用Model Binding解除Session, Cookie等依赖
上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖. 其实这个也可以 ...
- Asp.net MVC使用Filter解除Session, Cookie等依赖
本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...
- Asp.net mvc中的Ajax处理
在Asp.net MVC中的使用Ajax, 可以使用通用的Jquery提供的ajax方法,也可以使用MVC中的AjaxHelper. 这篇文章不对具体如何使用做详细说明,只对于在使用Ajax中的一些需 ...
- 在 ASP.NET MVC 中使用 Chart 控件
在 .NET 3.5 的时候,微软就提供了一个 Chart 控件,网络上有大量的关于在 VS2008 中使用这个控件的文章,在 VS2010 中,这个控件已经被集成到 ASP.NET 4.0 中,可以 ...
- ASP.NET Core 中简单Session登录校验
ASP.NET Core 中简单Session登录校验:从Session的配置添加.到请求过滤.再到页面操作.推荐相关阅读:ASP.NET 会话状态概述 ASP.NET Cookie 概述 ASP ...
最新文章
- 外贸网站制作 网页的宽度多少为合适
- ubuntu下安装eclipse
- DELL optiplex 解决改回 AHCI蓝屏问题
- oracle symonym_Oracle的同义词(synonyms)
- 事理图谱概念辨析及其与风险标签分类结合的应用探讨
- MP 启动注入 SQL 原理分析
- 按钮button加超链接
- c# 调用oracle function,C#调用Oracle存储过程的方法
- 为什么rand()+ rand()产生负数?
- 如何让Zen Cart 不在头部显示分类
- linux ape,linux把ape+cue格式转换成flac,同时保留曲目信息转载
- 为了云计算的安全需要自己控制加密密钥
- 学习NA,Dynamips实验环境(工大瑞普)下载地址
- linux系统pdf目录编辑器,适用于Linux系统的七款PDF内容编辑器,附下载和安装方法...
- java实现心型代码
- [转载]ExtJS中grid按照中文拼音首字母排序、改变行背景、列背景、静态数据分页不再困难...
- 我以为猫咪牙齿断了一点不要紧,结果…
- golang 根据生日计算星座和属相
- HTML+CSS实现一个淡显淡隐轮播图
- java.lang.IllegalArgumentException: Illegal URL:
热门文章
- matlab speex的语音处理模块_基于MATLAB的条形码识别系统[GUI,可识别几十个图片]...
- linux yum 目录在哪,急问怎么知道yum从哪个地址下载的文件呢?
- android os跑电量咋关,android 优化耗电量
- java 构造器 null_java - 主结尾处的Java构造函数用户输入在构造函数中为Null - 堆栈内存溢出...
- 用python程序化交易名单_python程序化交易神器——tushare
- python数据应用场景_python应用场景
- 典型大数据和数据库相关活动的图标
- 电商促销PSD分层海报设计流程,设计师收好
- 适用于iPhone X屏幕|美丽线框 UI套件模板
- 微博html怎么编辑器,类似新浪微博的编辑器 输入@就出现可选的下拉框 是怎么实现的...