一、httpcontext概述:
httpcontext封装关于单个http请求的所有http特定信息。
httpcontext基于httpapplication的处理管道,由于httpcontext对象贯穿整个处理过程,所以,可以从httpapplication处理管道的前端将状态数据传递到管道的后端,完成状态的传递任务。
httpcontext类它对request、respose、server等等都进行了封装,并保证在整个请求周期内都可以随时随地的调用;为继承 ihttpmodule 和 ihttphandler 接口的类提供了对当前 http 请求的 httpcontext 对象的引用。
当我们创建一个一般处理程序handler.ashx时,我们可以在文件中看到这一句:public void processrequest (httpcontext context);
1、访问方式
1、在webform或类库(包括mvc)项目中,通过current静态属性,就能够获得httpcontext的对象。
httpcontext context = httpcontext.current;
2、如果是在asp.net mvc的controller中,通过this.httpcontext就能获取到httpcontextbase对象。
httpcontextbase context = this.httpcontext;
3、如果是在mvc视图中可以这样得到:
@html.viewcontext.httpcontext
2、成员对象:
- application:为当前 http 请求获取httpapplicationstate 对象。
- cache:获取当前应用程序域的cache 对象。
- request:为当前 http 请求获取httprequest 对象。
- response:获取当前 http 响应的httpresponse 对象。
- server:获取提供用于处理 web 请求的方法的httpserverutility 对象。
- session:为当前 http 请求获取httpsessionstate 对象。
- user:为当前 http 请求获取或设置安全信息。
二、application属性:保存所有用户共用的信息
application属性为当前 http 请求获取 httpapplicationstate 对象。
application用来保存所有用户共用的信息。
在asp时代,如果要保存的数据在应用程序生存期内不会或者很少发生改变,那么使用application是理想的选择。但是在asp.net开发环境中我们把类似的配置数据放在web.config中。
httpapplicationstate类可以通过page.application访问。
如果要使用application 要注意的是所有的写操作都要在application_onstart事件中完成(global.asax),尽管可以使用application.lock()避免了冲突,但是它串行化了对application的请求,会产生严重的性能瓶颈。
不要使用application保存大数据量信息。
global.asax:
void application_onstart() { application["userid"] = "test"; string username = application["userid"].tostring(); //修改 application.lock(); application["count"] = (application["userid"] as int) + 1; application.unlock(); }
三、cache属性:当前应用程序域服务端缓存对象
cache属性获取当前应用程序域的 cache 对象。cache为服务端缓存对象。
cache和application:用于服务端,整个应用程序、所有用户拥有。
cache用于在http请求期间保存页面或者数据, cache的使用可以大大的提高整个应用程序的效率,它允许将频繁访问的服务器资源存储在内存中,当用户发出相同的请求后,服务器不是再次处理而是将cache中保存的数据直接返回给用户,
可以看出cache节省的是时间—服务器处理时间。
cache实例是每一个应用程序专有的,其生命周期==该应用程序周期,应用程序重启将重新创建其实例
httpcontext.cache 是对底层httpruntime.cache 缓存类的封装,由于封装到了 httpcontext ,局限于只能在 httpcontext 下使用,即只能用于 web 应用。
所以在可以的条件,尽量用底层的httpruntime.cache ,而不是用httpcontext.cache 。
cache一般用于数据较固定,访问较频繁的地方,例如在前端进行分页的时候,初始化把数据放入缓存中,然后每次分页都从缓存中取数据,这样减少了连接数据库的次数,提高了系统的性能。
1.创建cache
cache.insert(string key,object value,cachedependency dependencies,datetime absoluteexpiration,timespan slidingexpiration)
cache["id"] = "yiner"; //或者 cache.insert("id", "test");//可以缓存任何对象,比如:datatable //缓存依赖 cachedependency cachedep = new cachedependency(server.mappath("~/app_data/data.xml")); cache.insert("id", "test", cachedep);//当data.xml更改时,该缓存自动删除 //设置过期时间:后两个参数依次为:过期的绝对时间、过期的相对时间 cache.insert("id", "test", null, datetime.now.addminutes(10), cache.noslidingexpiration); cache.insert("id", "test", null, cache.noabsoluteexpiration, new timespan(0, 10, 0));
2.销毁cache
cache.remove("id");
3.调用cache
例如你存的是一个datatable对象,调用如下:
datatable finaltable = cache["id"] as datatable; //或 datatable finaltable = (datatable)cache.get("id")
四、request属性
request属性为当前 http 请求获取 httprequest 对象。
在服务器收到客户端的请求后,httpruntime将会创建一个httprequest对象的实例,这个实例就是我们在页面中常用的request。
request属性可通过httpcontext.current或page对象来访问。
在客户端的请求内容中,主要包含三部分内容。请求行,请求头部,请求主体。
1、httprequest 对象的属性
- request.headers:获取 http 头集合:(结果略)
- request.requesttype:获取客户端的请求方式,即get或post:get
- request.httpmethod:获取客户端使用的 http 数据传输方法(如 get、post 或 head):get
- request.accepttypes:获取客户端支持的 mime 接受类型的字符串数组:*/*
- request.rawurl:获取当前请求的原始url:/webform1.aspx?id=a,rawurl不包含主机信息和端口号
- request.url:获取有关当前请求的 url 的信息:http://localhost:10693/webform1.aspx?id=a
- request.urlreferrer:获取有关客户端上次请求的 url 的信息,该请求链接到当前的 url:
- request.filepath:获取当前请求的虚拟路径:/webform1.aspx
- request.currentexecutionfilepath:获取当前请求的虚拟路径:/webform1.aspx
- request.path:获取当前请求的虚拟路径:/webform1.aspx
- request.apprelativecurrentexecutionfilepath:获取应用程序根的虚拟路径,并通过对应用程序根使用波形符 (~) 表示法(例如,以“~/page.aspx”的形式)使该路径成为相对路径:~/webform1.aspx
- request.physicalpath:获取与请求的 url 相对应的物理文件系统路径:e:\webapplication1\webapplication1\webform1.aspx
- request.files:获取客户端发送的 文件的集合:httpfilecollection对象
- request.form:获取窗体变量集合:htmlform控件的method的默认值post,表单数据以http标头形式发送到server
- request.querystring:获取 http 查询字符串变量集合:id=a;htmlform控件的method的默认值get,表单数据附在网址后。
- request.servervariables:获取 web 服务器变量的集合:request.servervariables["local_addr"] :server地址 ;request.servervariables["remote_addr"]:客户端地址。
- request.cookies :cookies 项的集合httpcookiecollection对象。
- request.params:获取querystring、form、servervariables和 cookies 项的组合集合。(结果略)
- request.contentencoding:获取或设置实体主体的字符集:system.text.utf8encoding
- request.contentlength:指定客户端发送的内容长度(以字节计):0
- request.contenttype:获取或设置传入请求的 mime 内容类型:
- request.browser:获取或设置有关正在请求的客户端的浏览器功能的信息:(见下面详解)
- request.useragent:获取客户端浏览器的原始用户代理信息:(结果略)
- request.userhostaddress:获取远程客户端的ip主机地址:127.0.0.1
- request.userhostname:获取远程客户端的dns名称:127.0.0.1
- request.userlanguages:获取客户端语言首选项的排序字符串数组:zh-cn
2、request.browser对象的属性
request对象的browser属性来获取客户端浏览器的一些信息:
- request.browser.browser:获取由浏览器在 user-agent 请求标头中发送的浏览器字符串:ie
- request.browser.majorversion:获取浏览器的主(整数)版本号:8
- request.browser.minorversion:获取浏览器的次(即小数)版本号:0
- request.browser.activexcontrols:指示浏览器是否支持 activex 控件:true
- request.browser.cookies:示浏览器是否支持 cookie:true
- request.browser.ecmascriptversion:获取浏览器支持的 ecmascript 的版本号:1.2
- request.browser.w3cdomversion:获取浏览器支持的万维网联合会 (w3c) xml 文档对象模型 (dom) 的版本:1.0
五、response属性:http 响应信息
response属性获取当前 http 响应的 httpresponse 对象。
封装来自 asp.net 操作的 http 响应信息。
在代码中,httpresponse的对象引用由关键字response
。 例如,response.clear()
是指httpresponse.clear方法。
page类具有名为的属性response的当前实例。
httpresponse类的方法和属性通过httpapplication、 httpcontext、page、usercontrol类的response的属性进行公开。
1、属性
- bufferoutput:获取或设置一个值,该值指示是否缓冲输出并在处理完整个页之后发送它。
- cache:获取网页的缓存策略(例如:过期时间、保密性设置和变化条款)。
- cookies:获取响应 cookie 集合。
- filter:获取或设置一个包装筛选器对象,该对象用于在传输之前修改 http 实体主体。
- output:启用到输出 http 响应流的文本输出。
- outputstream:启用到输出 http 内容主体的二进制输出。
2、方法
- addcachedependency(cachedependency[]):将一组缓存依赖项与响应关联,这样,如果响应存储在输出缓存中并且指定的依赖项发生变化,就可以使该响应失效。
- removeoutputcacheitem(string):从缓存中移除与默认输出缓存提供程序关联的所有缓存项。 此方法是静态的。
- addcacheitemdependencies(string[]):使缓存项的有效性依赖于缓存中的另一项。。
- addfiledependencies(string[]):将文件名数组添加到当前响应依赖的文件名集合中。
- setcookie(httpcookie):更新 cookie 集合中的一个现有 cookie。因为 httpresponse.setcookie 方法仅供内部使用, 可以改为调用 httpresponse.cookies.set 方法
- appendcookie(httpcookie):将一个 http cookie 添加到内部 cookie 集合。
- appendheader(string, string):将 http 头添加到输出流。
- clearheaders():清除缓冲区流中的所有头。
- redirect(string, boolean):将客户端重定向到新的 url。 指定新的 url 并指定当前页的执行是否应终止。
- binarywrite(byte[]):将二进制字符串写入 http 输出流。
- write(string):将一个字符串写入 http 响应输出流。
- writefile(string):将指定文件的内容作为文件块直接写入 http 响应输出流。
- transmitfile(string):将指定的文件直接写入 http 响应输出流,而不在内存中缓冲该文件。
- clear():清除缓冲区流中的所有内容输出。
- clearcontent():清除缓冲区流中的所有内容输出。
- flush():向客户端发送当前所有缓冲的输出。
- end():将当前所有缓冲的输出发送到客户端,停止该页的执行,并引发 endrequest 事件。
- close():关闭到客户端的套接字连接。
六、server属性
在asp.net webform中,server属性获取提供用于处理 web 请求的方法的 httpserverutility 对象。而在asp.net mvc中,server对象是httpserverutilitybase对象。
通过page.server属性访问,提供用于对web请求的help方法。
1、属性
- machinename:获取服务器的计算机名称。、
- scripttimeout:获取和设置请求超时值(以秒计)。
2、方法
- execute:在当前请求的上下文中(服务端中)执行指定资源的处理程序,然后将执行返回给调用它的页。
- transfer:终止当前页的执行,并为当前请求开始执行新页。
- htmlencode/htmldecode:对要在浏览器中显示的html字符串进行编码。/对已被编码以消除无效 html 字符的字符串进行解码
- urlencode/urldecode:编码/解码url字符串,以便通过 url 从 web 上进行可靠的 http 传输。
- urlpathencode:对 url 字符串的路径部分进行 url 编码并返回编码后的字符串。
- mappath:返回与 web 服务器上的指定虚拟路径相对应的物理文件路径。 该方法经常使用。将虚拟路径转换为服务器物理路径。
context.response.write(context.server.mappath("/")); //输出 c:\users\administrator\desktop\webapplication1\webapplication1\ //该方法经常用,将虚拟路径转换为物理路径 context.response.write("<div style='background-color:red'>htmlencode测试</div>"); //如果不编码,默认就是会被浏览器解析的 context.response.write(context.server.htmlencode("<div style='background-color:red'>htmlencode测试</div>")); //经过编码之后 原样输出
httputility 类由 httpserverutility 类在内部使用,httputility 类包含无法从 server访问的编码和解码实用工具方法,如:parsequerystring()方法等。
response.write("|url:"+httputility.urlencode("你好啊"));
若要对 web 应用程序之外的值进行编码或解码,请使用 webutility 类。
3、server.execute、server.transfer、response.redirect区别
- server.execute方法允许当前的aspx页面执行一个同一web服务器上的指定aspx页面,当指定的aspx页面执行完毕,控制流程重新返回原页面发出server.execute调用的位置。
- server.transfer的跳转完全是在服务器端,浏览器根本不知道已经跳转了,因此路径显示的仍然是原路径。
- response.redirect是客户端发送请求到服务器,服务器执行response.redirect之后,返回302,浏览器接收到请求后,再次发送一次请求到要跳转的url.
在网络状态较好的情况下,redirect(url)方法效率最高!! 可重定向到同一台或非同一台服务器上的aspx或非aspx(html)资源。
server.transfer方法和server.execute方法最灵活!! 但只能转到同一application目录下,也有可能导致不期望的结果发生。
server.execute方法占用资源最多.
七、session属性:每一个用户的专有信息
session属性为当前 http 请求获取 httpsessionstate 对象。
session用来保存每一个用户的专有信息。 httpsessionstate类通过httpcontext或page对象的session属性访问。一台客户机上多个浏览器窗口访问只有一个session。
session的生存期是用户持续请求时间加上一段时间(一般是20分钟左右), session超时或者被关闭将自动释放数据信息,由于用户停止使用应用程序之后它仍在内存中存留一段时间,因此这种方法效率较低。
session信息是保存在web服务器内存中的,保存数据量可大可小。
1、配置session
在web.config中的 <system.web> </system.web>之间添加
<sessionstate mode="inproc"//inproc:保存到内存,off;stateserver;sqlserver等 stateconnectionstring="tcpip=127.0.0.1:42424" sqlconnectionstring="data source=127.0.0.1;trusted_connection=yes" cookieless="false" //如果cookieless=true表示不用cookie,用url查询字符串传送会话id。 timeout="20" />
其中timeout是过期时间,如20分钟后超时。
2、操作session:
//添加: session["username"] = "aaa"; //获取: if (session["username"] != null) { string str = session["username"].tostring(); } //清除某个session session["username"] = null; session.remove("username"); //清除全部session session.clear();
八、user属性
user的属性提供对iprincipal接口的属性和方法的编程访问。
这个属性能让我们访问各种信息,包括用户是否已验证,用户的类型,用户名等等,我们还可以对该属性的功能进性扩展,以实现我们的要求。
分配给httpcontext.user的对象必须实现iprincipal接口,而iprincipal定义的属性之一是identity,它必须实现iidentity接口。
if (user.identity.isauthenticated) { page.title = "home page for " + user.identity.name; } else { page.title = "home page for guest user."; }
到此这篇关于asp.net中httpcontext对象的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。
发表评论