HttpContext

一、概要

当我们创建一个一般处理程序Handler.ashx时,我们可以在文件中看到这一句
public void ProcessRequest (HttpContext context)
HttpContext 类是.NET Framework 类库中很重要的一个类。它封装有关个别 HTTP 请求的所有 HTTP 特定的信息。
HttpContext的命名空间:System.Web
HttpContext的程序集:System.Web(在 system.web.dll 中)
为继承 IHttpModule 和 IHttpHandler 接口的类提供了对当前 HTTP 请求的 HttpContext 对象的引用。该对象提供对请求的内部 Request、Response 和 Server 属性的访问。
例如:我们可以这样用Response
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
1.生存周期:从客户端用户点击并产生了一个向服务器发送请求开始---服务器处理完请求并生成返回到客户端为止。注:针对每个不同用户的请求,服务器都会创建一个新的HttpContext实例直到请求结束,服务器销毁这个实例。

2.为什么会有HttpContext类呢:在ASP年代大家都是通过在.asp页面的代码中使用Request、Respose、Server等等这些Http特定信息的。但在ASP.NET时代,这中方式已经无法满足应用,(比如我们要在IHttpModule中处理Request时,我们使用什么方法来获取呢?于是就产生了HttpContext类,它对Request、Respose、Server等等都进行了封装,并保证在整个请求周期内都可以随时随地的调用)。

3.特殊性:当然HttpContext不仅仅只有这点功能.ASP.NET中它还提供了很多特殊的功能。例如Cache、还有HttpContext.Item,通过它你可以在HttpContext的生存周期内提前存储一些临时的数据,方便随时使用。

二、Items

ASP.NET提供了很多变量来管理状态:比如application state,session state,view state等。这里介绍一种通过HttpContext类的Items(属性) 集合来保存Http状态。

HttpContext对象只针对一个单一的http请求(注意http的无状态)。这个类的属性还有Request对象、Response对象、Session对象等。你可以通过Context.Items["MyObject"] = new object();或 object o = Context.Items["MyObject"];来set或get 它。Items包含了key-value形式的哈希表对象。

主要用法:

1、在两个表单之间传递数据,看下面的代码:

对于WebForm1:

private void Page_Load(object sender, System.EventArgs e)

{
   ArrayList list = new ArrayList(4);
   list.Add("This list ");
   list.Add("is for ");
   list.Add("WebForm2 ");
   list.Add("to see. ");
   Context.Items["WebForm1List"] = list;
   Server.Transfer("WebForm2.aspx");
}

//特别说明Server。Transfer是在服务器直接操作的的和调用的地方属于同一次http请求,此处如果使用Response.Redirect则再WebForm2中再次访问Context.Items["WebForm1List"]时,Context.Items["WebForm1List"]null,因为Response.Redirect是重新发起了一次Http请求

对于WebForm2:

private void Page_Load(object sender, System.EventArgs e)
{
   ArrayList list = Context.Items["WebForm1List"] as ArrayList;
   if(list != null)
   {
    foreach(string s in list)
    {
        Response.Write(s);
    }
   }
}

在WebForm1的页面加载过程中,通过Server.Transfer方法,将WebForm1的状态传递到了WebForm2,WebForm2可以得到它,并作一些相应的处理。用法1也可以用Session来做。

2、截获Http请求并作特殊处理

主要是用在Application_BeginRequest方法里。Application_BeginRequest方法在global.asax.cs里定义。你可以在Http请求刚刚开始的时候,截获他,做一些特殊的处理。这里你不能用Session来做,因为此时Session对象还没有被建立。
利用Context.Item集合,你可以在Http请求的整个生命期,通过HttpModules, HttpHandlers, Webforms, and Application 事件。

三、Request

ASP.NET RequestRequest封装了客户端请求信息,是从客户端得到数据,常用的三种取得数据的方法是:Request.Form、Request.QueryString,Request。其第三种是前两种的一个缩写,可以取代前两种情况。而前两种主要对应的Form提交时的两种不同的提交方法:分别是Post方法和Get方法。

ASP.NET Request对象的属性和方法比较多,常用的几个为:UserAgent 传回客户端浏览器的版本信息,UserHostAddress 传回远方客户端机器的主机IP 地址,UserHostName 传回远方客户端机器的DNS 名称,PhysicalApplicationPath 传回目前请求网页在Server 端的真实路径。

ASP.NET Request对象使用之从浏览器获取数据

利用ASP.NET Request对象方法,可以读取其他页面提交过来的数据。提交的数据有两种形式:一种是通过Form表单提交过来,另一种是通过超级链接后面的参数提交过来,两种方式都可以利用Request对象读取。

﹤%@ Page Language="C#"%﹥
﹤%
    string strUserName = Request["Name"];
    string strUserLove = Request["Love"];
%﹥
姓名:﹤%=strUserName%﹥
爱好:﹤%=strUserLove%﹥
﹤form action="" method="post"﹥
﹤P﹥姓名:﹤input type="TEXT" size="20" name="Name"﹥﹤/P﹥
﹤P﹥兴趣:﹤input type="TEXT" size="20" name="Love"﹥﹤/P﹥
﹤P﹥﹤input type="submit" value="提 交"﹥﹤/P﹥
﹤/form﹥

ASP.NET Request对象使用之得到客户端的信息
利用Request对象内置的属性,可以得到一些客户端的信息,比如客户端浏览器版本和客户端地址等等
﹤%@ Page Language="C#"%﹥ 
客户端浏览器:﹤%=Request.UserAgent %﹥ 
客户端IP地址:﹤%=Request.UserHostAddress %﹥  
当前文件服务端物理路径:﹤%=Request.PhysicalApplicationPath %﹥
Request常见的属性有:


属性名


值类型


说明


ApplicationPath


String


获取请求的资源在网站上的根路径


ContentEncoding


Encoding


设置请求对象的编码


Cookies


HttpCookieCollection


客户端发送到服务器的Cookie集合


QueryString


NameValueCollection


当前请求的查询字符串集合


UrlReferrer


Uri


获取用户由哪个url跳转到当前页面

四、Response

Response代表了服务器响应对象。每次客户端发出一个请求的时候,服务器就会用一个响应对象来处理这个请求,处理完这个请求之后,服务器就会销毁这个相应对象,以便继续接受其它客服端请求。

Response常用属性如下:


属性名


值类型


说明


Charset


string


表示输出流的所使用的字符集


ContentEncoding


Encoding


设置输出流的编码


ContentLength


Int


输出流的字节大小


ContentType


string


输出流的HTTP MIME类型


Cookies


HttpCookieCollection


服务器发送到客户端的Cookie集合


Output


TextWriter


服务器响应对象的字符输出流


RedirectLocation


string


将当前请求重定向s

Response常用方法如下:


方法名


返回值类型


说明


AppendCookie


void


向响应对象的Cookie集合中增加一个Cookie


Clear


void


清空缓冲区中的所有内容输出


Close


void


关闭当前服务器到客户端的连接


End


void


终止响应,并且将缓冲区中的输出发送到客户端


Redirect


void


重定向当前请求

关于Response.Redirect和Server.Transfer:

response.redirect其实上是当服务器碰到这条语句时发送一条指令(包含新的地址)给浏览器,然后让浏览器去发送http请求,请求response.redirect后面的那个新的http地址,流程如下:

浏览器文件请求->服务器执行->遇到response.redirect语句->服务器发送response.redirect后面的地址给客户机端的浏览器->浏览器请求执行新的地址(服务器返回的Response.Redirect后面的地址)这就是一个小小的Response.Redirect的全部过程, Server.Transfer语句当接受地址后是直接转向后面的地址,流程如下:

浏览器文件请求->服务器执行->遇到Server.Transfer语句->服务器转向新的文件。

Server.Transfer方法与Redirect方法相比另一个显著的优势是在页面转换时,Request集合里的内容不会丢失(同一个http请求),这给我们编程带来很大的方便.

一般的情况下尽可能用Server.Transfer方法(前提是服务器是IIS),Server.Transfer方法更快速,而且因为只在服务器上执行,所以可以和任何浏览器兼容。

五、Server

Server对象是用于获取服务器的相关信息的对象。它常用方法如下:


属性名


返回值类型


说明


Execute


void


执行指定的资源,并且在执行完之后再执行本页的代码


HtmlDecode


string


消除对特殊字符串编码的影响


HtmlEncode


string


对特殊字符串进行编码


MapPath


string


获取指定相对路径在服务器上的无力路径


Transfer


void


停止执行当前程序,执行指定的资源


UrlDecode


string


对路径字符串进行解码


UrlEncode


string


对路径字符串进行编码

上面的方法光从概念上来说,似乎还是让人不能分清他们到底有什么作用,特别Excure/ Transfer、HtmlEncode(HtmlDecode)/ UrlEncode(UrlDecode)这两组。在讲述他们分别之前先讲述MapPath这个方法的作用,在我们上传文件的时候要以物理路径保存上传文件到服务器,而我们使用得最多的是相对URL地址,这个方法就起到了将相对URL地址转换成服务器物理路径的作用。为了说明Excure/ Transfer及HtmlEncode(HtmlDecode)/ UrlEncode(UrlDecode)的区别,我们还是用实例代码来展示:

<ul>
<li>Server.MapPath(".")=<%=Server.MapPath(".")%></li>
<li><%=Server.HtmlEncode("<h1>Server---HtmlEncode</h1>")%></li>
<li><%=Server.HtmlDecode("<h1>Server---HtmlDecode</h1>")%></li>
<li><h1>Server---Nothing</h1></li>
<li><%=Server.UrlEncode("<a href=\"http://www.cnblogs.com/qiufuwu618\">深秋叶落</a>")%></li>
<li><%=Server.UrlDecode("<a href=\"http://www.cnblogs.com/qiufuwu618\">深秋叶落</a>")%></li>
<li><a href="http://www.cnblogs.com/qiufuwu618">深秋叶落</a></li>
</ul> 

从Server.MathPath(“.”)证明确实能获取到相对路径的在服务器上的实际物理地址。

在上面的例子中我们想在网页中输出HTML代码,如果直接输出往往得不到想要的效果,这时可以借助HtmlEncode方法对要输出的HTML代码进行编码,这样输出到浏览器上的时候就能看到HTML代码(包含html标志),而不是HTML形式的效果。HtmlDecode方法则是用来消除这种影响。

如果我们直接输出“<a href="http://www.cnblogs.com/qiufuwu618">深秋叶落</a>”这个字符串的话,在网页上会显示一个超级链接,但是有时候我们希望把这个超级链接作为QueryString的一个参数,由于url地址的特殊性,比如“:”、“/”等字符串在URL地址中有特殊的含义,要想输出这些字符,直接输出是不行的,需要进行某种转换,并且将来还能转换回来。经过UrlEncode方法转换之后,“:”、“/”分别转换成了“%3a”和“%2f”这样的字符,并且汉字也进行了转换。UrlDecode方法则是将“%3a”和“%2f”等这样的字符转换成我们原本要表示的字符。

时间: 2024-10-23 09:31:37

HttpContext的相关文章

HttpContext, HttpContextBase和HttpContxtWrapper

HttpContext HttpContext是ASP.Net中的context对象.但是使用这个类的问题在于,它没有基类,而且不是virtual函数.这样,我们在写unit test的时候没有办法mock它.因此,建议是不要把HttpContext作为参数传递,而是用HttpContextBase替代. HttpContextBase 这是在C# 3.5中的新特性,用于取代HttpContext.由于该类是抽象类,因此是可以mock的. HttpContextWrapper 这个类也是在C#3

HttpContext.Current.Session 和 Session 的区别

Session(会话)通常指一个动作从开始到结束不间断的一个动作. 例如“打电话”,通常是“1.拿起电话--2.拨对方号码--3.对方截图--4.挂机”.这四个步骤从完成到结束组成了一个基本的Session,中间任何一步断裂,都会导致Session的失效. 而在浏览器里,Session主要通过连接传递,“打开购物--点击连接选择物品--添加到购物车--结账”组成了一个Session,在不使用Cookie的情况下,中间任何一步断裂都会Session失效. 所有,你用浏览器打开2个页面,在一个页面里

HttpContext.Current.Session[strName]未将对象引用设置到对象的实例

项目开发是在4.5.1上,不知道为啥客户提供的服务器上安装的是4.5,差别不大也没去升级,然后部署MVC的时候web.config报错 <system.web> <compilation debug="true" targetFramework="4.5.1"/> <httpRuntime targetFramework="4.5.1"/> </system.web> 然后也没在意就把这段给删掉了,

NET Core中怎么使用HttpContext.Current

NET Core中怎么使用HttpContext.Current 阅读目录 一.前言 二.IHttpContextAccessor 三.HttpContextAccessor 回到目录 一.前言 我们都知道,ASP.NET Core作为最新的框架,在MVC5和ASP.NET WebForm的基础上做了大量的重构.如果我们想使用以前版本中的HttpContext.Current的话,目前是不可用的,因为ASP.NET Core中是并没有这个API的. 当然我们也可以通过在Controller中访问

HttpContext及HttpContext.current

慎用System.Web.HttpContext.Current http://www.cnblogs.com/david1989/p/3879201.html 线程编程中用到HttpContext.Current的方法封装 http://www.cnblogs.com/xdotnet/archive/2007/06/25/aspnet_threading_httpcontext.html HttpContext只是个类名,HttpContext.Current才是一个已实例化的对象..比如这样

.NET CORE 2.0之 依赖注入在类中获取IHostingEnvironment,HttpContext

在.NET CORE 中,依赖注入非常常见, 在原先的 HttpContext中常用的server.Mappath已经么有了如下: HttpContext.Current.Server.MapPath("xx") 取而代之的是IHostingEnvironment 环境变量 可以通过依赖注入方式来使用,不过在大多数的情况下 我们需要在,类中使用,通过传统入的方式就不太合适,如下: 可以换一种方式来处理 新建一个类如下: public static class MyServiceProv

.NET CORE 2.0之 httpcontext

HttpContext  在之前的.NET framewor 是一个非常常用且强大的类,在.NET CORE2.0中要像以前用是不太方便的了, 要是用sesson 首先需要在startup 的Configure 声明使用session app.UseSession(); 区别如下 Session: .NET Framework 取值: string  a=System.Web.HttpContext.Current.Session["xxx"] 赋值: System.Web.HttpC

http流请求时,被请求站点HttpContext.Current为null?

我负责运维一个短信接口站点sms.调用上游短信供应商下发短信后,他们会给我们推送发送报告.报告是类似DELIVRD.DI:9432这样的码.为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死在程序里的.这样的弊端是,后期每次添加了这个映射关系后,都要更新网站程序,增大了维护成本.为了降低维护成本,我做了改进方案.将这个映射关系保存到一个文本文件ReportCodeMapper.txt里,提供一个页面来允许修改这个文件的内容. 对于使用的逻辑,声明一个静态的Dictionary,初始化时

慎用System.Web.HttpContext.Current

每当控制流离开页面派生的Web表单上的代码的时候,HttpContext类的静态属性Current可能是有用的. 使用这个属性,我们可以获取当前请求(Request),响应(Response),会话(Session,)和应用程序对象(Application objects)以及请求更多服务. 以下面的代码为例. private void Page_Load(object sender, System.EventArgs e) { MyClass myClass = new MyClass();

HttpContext.GetOwinContext().Authentication 报错 解决办法

HttpContext.GetOwinContext().Authentication 会提示 不包含GetOwinContext 方法的报错信息. 经过多方查阅后找到解决方法,特地分享给大家. 这个错误的原因就是由于没有引用Microsoft.Owin.Host.SystemWeb 在nuget控制台输入:install-package Microsoft.Owin.Host.SystemWeb  就可以解决该问题