上一个随笔主要针对HttpModeul[ASP.NET基础之HttpModule学习]内容进行一个简单的学习;本章内容我将对ASP.NET另一个主要的知识点HttpContext进行学习;首先我们简单了解一些理论的知识,然后结合一些实例演示我们开发时经常要用到的一些功能,其中有些部分是从网上整理所得,希望对您的阅读有所帮助;
一:HttpContext理论知识:
1:HttpContext类它对Request、Respose、Server等等都进行了封装,并保证在整个请求周期内都可以随时随地的调用;为继承 IHttpModule 和 IHttpHandler 接口的类提供了对当前 HTTP 请求的 HttpContext 对象的引用。该对象提供对请求的内部Request、Response 和 Server 属性的访问。HttpContext的命名空间:System.Web(在 system.web.dll 中);除了对几个对象进行封装外它还有个HttpContext.Item,通过它你可以在HttpContext的生存周期内提前存储一些临时的数据,方便随时使用。
2:生存周期:从客户端用户点击并产生了一个向服务器发送请求开始---服务器处理完请求并生成返回到客户端为止。针对每个不同用户的请求,服务器都会创建一个新的HttpContext实例直到请求结束,服务器销毁这个实例。
3:当我们创建一个一般处理程序Handler.ashx时,我们可以在文件中看到这一句 public void ProcessRequest (HttpContext context);
4:可以通过HttpContext.Current获得当前的上下文httpContext的内容;这样可以在多处方便获取我们想要的数据;
二:HttpContext.Item的运用
在文中第一点我们有提到HttpContext.Item可以通过它来存储一些临时的数据;我们将通过一个实例来演示它的实现,以及在此过程中应该注意什么;还针对ASP.NET常见的两种跳转进行比较(分别为:Server.Transfer和Response.Redirect);
1:首先我们新建一个页面对HttpContext.Item它进行写入数据(此处不一样的是当写完值后不同的页面跳转方式):
protected void Btn_Transfer_Click(object sender, EventArgs e) { Listlist = new List<string>(); list.Add("踏浪帅"); list.Add("www.cnblogs.com/wujy"); HttpContext.Current.Items["TransferName"] = list; Server.Transfer("Index.aspx"); } protected void Btn_Redirect_Click(object sender, EventArgs e) { List list = new List<string>(); list.Add("踏浪帅"); list.Add("www.cnblogs.com/wujy"); HttpContext.Current.Items["RedirectName"] = list; Response.Redirect("Index.aspx"); }
接着我们再新建一个Index.aspx页面接收此页面的值:
public partial class Index : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { List<string> list = HttpContext.Current.Items["TransferName"] as List<string>; if (list != null) { foreach (string item in list) { Response.Write(string.Format("Transfer输出的值为:{0}
", item)); } } List<string> ResList = HttpContext.Current.Items["RedirectName"] as List<string>; if (ResList != null) { foreach (string item in ResList) { Response.Write(string.Format("Redirect输出的值为:{0}", item)); } } else { Response.Write("Response.Redirect传过来为空!"); } } } }
现在我们看一下运行的效果:
Server.Transfer方式 | Response.Redirect方式 |
从上面运行的结果我们不然发现使用Server.Transfer方式我们在接收页面成功获得我们写入的数据;而Response.Redirect方式却导致数据的丢失;出现这个问题的原因是Server.Transfer是在服务器直接操作的的和调用的地方属于同一次http请求,此处如果使用Response.Redirect是从客户端重新发起了一次Http请求;而正如我们前面所说的HttpContext的生存周期只能在一个http请求才不会被服务器销毁这个实例;
针对上面Server.Transfer是在服务器直接操作和调用的我们其实可以看一下我们跳转时URL地址的变化就知道了,URL它是没有变化的;
Server.Transfer | |
而Response.Redirect跳转后的URL地址是发生变化(它是从客户端再去做起一次请求访问到index.aspx页面):
注意:一般的情况下尽可能用Server.Transfer方法(前提是服务器是IIS),Server.Transfer方法更快速,而且因为只在服务器上执行,所以可以和任何浏览器兼容。
Response.Redirect其实上是当服务器碰到这条语句时发送一条指令(包含新的地址)给浏览器,然后让浏览器去发送http请求,请求Response.Redirect后面的那个新的http地址,流程如下:浏览器文件请求->服务器执行->遇到response.redirect语句->服务器发送Server.Transfer后面的地址给客户机端的浏览器->浏览器请求执行新的地址(服务器返回的Response.Redirect后面的地址)这就是一个小小的Response.Redirect的全部过程,
Server.Transfer语句当接受地址后是直接转向后面的地址,流程如下:浏览器文件请求->服务器执行->遇到Server.Transfer语句->服务器转向新的文件。
2:截获Http请求并作特殊处理
主要是用在Application_BeginRequest方法里。Application_BeginRequest方法在global.asax.cs里定义。你可以在Http请求刚刚开始的时候,截获他,做一些特殊的处理。这里你不能用Session来做,因为此时Session对象还没有被建立。 利用Context.Item集合,你可以在Http请求的整个生命期,通过HttpModules, HttpHandlers, Webforms, and Application 事件。
三:HttpContet对象之Request
1:Request理论知识:
ASP.NET Request 封装了客户端请求信息,是从客户端得到数据(从浏览器获取数据);常用的三种取得数据的方法是:Request.Form、Request.QueryString、Request其第三种是前两种的一个缩写,可以取代前两种情况。而前两种主要对应的Form提交时的两种不同的提交方法:分别是Post方法和Get方法。
2:新建一个页面用来显示Requesst一些常见属性信息的内容;
public partial class RequestPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { StringBuilder strBuider = new StringBuilder(); strBuider.Append("客户端主机的IP地址:" + HttpContext.Current.Request.UserHostAddress + ""); strBuider.Append("客户端浏览器版本:" + Request.UserAgent + ""); strBuider.Append("当前由哪个页面URL跳转过来:" + Request.UrlReferrer+ ""); strBuider.Append("当前要求的URL:" + Request.Url + ""); strBuider.Append("当前要求的URL绝对地址:" + Request.Url.AbsolutePath + ""); strBuider.Append("当前要求的URL绝对URI:" + Request.Url.AbsoluteUri + ""); strBuider.Append("当前要求的URL主机名跟端口:" + Request.Url.Authority + ""); strBuider.Append("当前要求的URL实例主机的一部分:" + Request.Url.Host + ""); strBuider.Append("当前要求的URL端口:" + Request.Url.Port + ""); strBuider.Append("当前要求的URL的内容第一个段:" + Request.Url.Segments[0] + ""); strBuider.Append("当前要求的URL的内容第二个段:" + Request.Url.Segments[1] + ""); strBuider.Append("当前要求的URL的内容第三个段:" + Request.Url.Segments[2] + ""); strBuider.Append("浏览器地址栏后的参数"+Request.QueryString + ""); strBuider.Append("当前网页在服务器端的实际路径:" + Request.PhysicalPath + ""); strBuider.Append("当前文件的物理地址:" + Request.PhysicalApplicationPath + ""); strBuider.Append("当前网页的相对地址:" + Request.Path + "
"); strBuider.Append("当前页面的URL:" + Request.RawUrl + "
"); strBuider.Append("客户端上传的文件(个数):" + Request.Files.Count + "
"); strBuider.Append("当前执行网页的相对地址:" + Request.FilePath + "
"); strBuider.Append("客户端浏览器的信息:" + Request.Browser + "
"); strBuider.Append("当前运行程序的服务器端虚拟目录:" + Request.ApplicationPath + "
"); strBuider.Append("客户端浏览器的字符设置:" + Request.ContentEncoding + "
"); Response.Write(strBuider.ToString()); } } }
运行结果显示(获得客户端浏览器以及一些相关的信息):
3:针对表单的提交方式如上面所说的有两种方式(POST以及GET);接下来我们则通过几段代码来演示有关表单提交的两种方式以及一些应该注意的事项;
(1)表单Get方式提交:
相信在我们平常的开发过程中使用Get方式进行提交的表单是最经常碰到的,它也是最简单的一种方式,主要注意在使用Get提交时URL对数据的大小是有限止;还经常碰到的情况是对URL传参时一些特殊符号的处理问题;接下来我们将通过小实例来演示两种对URL传参处理特殊符号方式;
首先是使用ASP.NET代码的Server对象对要传参进行一个编码的处理(Server.UrlEncode(string s));
string UserName = "踏浪帅¥%—*@"; Server.Transfer("GetPageResult.aspx?UserName="+Server.UrlEncode(UserName)+"&UserID=001");
接上时再对收到的参数进行一个解码(Get方式使用Request.QueryString[Name]和Request[Name]进行接收参数;解码Server.UrlDecode(string s)):
string UserName = Request.QueryString["UserName"]; Response.Write("第一个传参值:" + Server.UrlDecode(UserName) + ""); string UserID = Request["UserID"]; Response.Write("第二个传参值:" + UserID + "");
另外一种方式是使用JS进行传参,此得使用到的JS中的escape();而它接收解码跟上面使用ASP.NET代码是一样;
"server">