Asp.net mvc 中的HttpContext
一直以来对HttpContext都很模糊 今天特意在网上看了下 随便把整合记录下!
msdn解释:
HttpContext类:封装有关个别HTTP请求的所有HTTP特定的信息,又叫上下文。
看到这个解释,我觉得有些抽象,Http特定信息具体又是什么?看了下备注:
为继承 IHttpModule 和 IHttpHandler 接口的类提供了对当前 HTTP 请求的 HttpContext 对象的引用。该对象提供对请求的内部 Request、Response 和 Server 属性的访问。
这样一来,一下子又冒出来2个新东西: IHttpModule 和 IHttpHandler。真叫人抓狂啊。
先看HttpContext:
1.声明周期:从用户发送请求开始到服务器处理完请求并生成内容返回到客户端为止。原来就是从点击一个链接开始,到看到这个链接里的全部内容为止,这个理解了。
备注:针对每个不同用户的请求,服务器都会创建一个新的HttpContext实例直到请求结束,服务器销毁这个实例.
2.HttpContext的作用:处理请求的属性如:request,response,server等。其实我们在开发asp.net页面的时候,可以直接使用request...这些类啊,为什么要通过HttpContext类来访问呢?原来,request等这些类可以在asp或aspx页面的代码中直接使用,但是在IHttpModule或IHttpHandler中就不能直接使用了。这是因为要在特殊场合访问request等。因为HttpContext类对Request,Respose,Server等等都进行了封装,并保证在整个请求周期内都可以随时随地的调用.)OK,这个也理解了。
3.HttpContext其它功能:HttpContext还可以处理CacHe,HttpContext.Item等,在其生命周期内可以存储一些临时数据,方便随时使用。
再度理解HttpContext:
当用户发送某个Http请求,我们可以通过HttpContext进行截获,查看里面包含了哪些请求的信息,然后可以进行一系列的操作,比如说切换到其他的页面,这个时候,可以重组请求的数据满足新页面的要求。即:即使不在page页面中,也可以通过HttpContext的Current属性来获取当前的web状态。
正是由于此,我们可能在程序中滥用HttpContext,这里有一篇文章可以帮助大家理解为什么不能滥用HttpContext:
http://odetocode.com/articles/112.aspx
虽然是04年的文章,但是,假如你没有看过或理解HttpContext,它对于我们来说都是新的。
当然了,要想完全理解HttpContext,我们还需要了解很多知识:比如:Cache,Profile,IHttpHandler,IHttpModule。这些知识一定要在实践中才能理解的更加深入。
实例:mvc FormsAuthenticationTicket
代码:
/// <summary> /// xxxx /// 调用在控制器前面添加[Authorize(Roles = "xxxx")] 注意在Global.asax使用票创建IPrincipal对象并存在HttpContext.User中 /// 原理,将用户角色信息保存在票据中,通过Global.asax,WEB.CONFIG中的设置,判断角色的权限 /// </summary> public static void FormsAuthen(string name, string rose) { FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket( 1,// 版本号。 name,// 与身份验证票关联的用户名。 DateTime.Now,// Cookie 的发出时间。 DateTime.Now.AddMinutes(40),// Cookie 的到期日期。 false,// 如果 Cookie 是持久的,为 true;否则为 false。 rose//写入用户角色 ); //加密 string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //存入Cookie System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
Global.asax 文件代码:
protected void Application_AuthenticateRequest(Object sender, EventArgs e) { HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie == null || authCookie.Value == "") { return; } FormsAuthenticationTicket authTicket = null; try { authTicket = FormsAuthentication.Decrypt(authCookie.Value);//解密 } catch { return; } string[] roles = authTicket.UserData.Split(new char[] { ';' });//根据存入时的格式分解,;或|.... if (Context.User != null) { Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);//存到HttpContext.User中 } }
我们既然写了 那怎么读取呢? 那就利用HttpContext类(简单点说他就是封装了用户的一些信息 至于为什么呢要存呢 浏览器是无状态的)
代码:
System.Web.HttpContext context = System.Web.HttpContext.Current; // 取得用户对象 System.Security.Principal.IPrincipal user = context.User; // 取得用户的角色数组 System.Web.Security.FormsIdentity fi = user.Identity as System.Web.Security.FormsIdentity; // 取得用户的票据 System.Web.Security.FormsAuthenticationTicket ticket = fi.Ticket; // 创建用户所拥有的角色数组 string roleString = ticket.UserData; // 还原为字符串数组 string[] roleArray = { roleString };//roleString.Split(','); // 自己创建用户对象 System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal( user.Identity, roleArray ); // 让系统使用我们的拥有角色的用户对象 context.User = principal; Response.Write(xxxx);
资料:http://www.cnblogs.com/zhongjie/archive/2011/06/12/2078939.html(这里引用下评论1楼的话 )
这篇文章是讲的ASP.NET Web Form机制中的页面生命周期和ASP.NET MVC是两码事。MVC其实理解起来很更简单,就像ASP一样,所有的操作都是由Request驱动的。说 白了就是只用知道当前请求的Url归那个Controller中action执行,执行时需要用到哪些数据(Model),执行后在那个试图(View)上显现这个Model即可。我的感觉是要比web form的方式理解起来更简单些。asp.net web form更像是在开发windows程序,而ASP.NET MVC才像是做Web开发。
这篇文章也是讲解 HttpContext
http://www.cnblogs.com/duanx/archive/2009/07/25/1459017.html