在ASP.NET WEB页面开发中,经常会需要保存一些信息,以便在不同的页面或时间段都能够访问到。这其中便会用到Session和Application。
Session 、Application 和 HttpContext 都是在服务器上开辟了一个内存空间,将一些信息存储到该内存空间中。
Session
:Session 会对每一个客户端(浏览器)在服务器端划分一个区域,该区域用于存储该客户端的一些信息,每一个客户端对应服务器端唯一的一个区域空间;Session默认的生存周期为20分钟,当Session超出20分钟或用户主动删除Session,则Session被销毁。
Application
:Application 对于每一个WEB网站在服务器端划分一个区域,但对于同一个WEB网站而言,Application 是共享的,也就是说,每一个客户端(浏览器)都可以访问同一个Application值;Application的生存周期为当前WEB网站启动直至关闭。
HttpContext
:HttpContext 有一个 Items属性的键值对,可以使用 HttpContext.Items["name"] = "Tom" 的方式来存储值。但HttpContext只对当前请求的响应管道内(生命周期)有效,一旦当前管道关闭或者被销毁,则HttpContext.Items的值也随之被销毁。(所以若使用HttpContext存储值,那么使用
Response.Redirect("页面地址")
的方式会使得页面周期被强行关闭而导致HttpContext被销毁;但是使用
Server.Transfer("页面地址")
的方式并不会使管道被关闭,所以HttpContext依旧会被保存下来。)
在ASP.NET WEB页面开发中,经常会需要保存一些信息,以便在不同的页面或时间段都能够访问到。这其中便会用到Session和Application。Session 、Application 和 HttpContext 都是在服务器上开辟了一个内存空间,将一些信息存储到该内存空间中。Session :Session 会对每一个客户端(浏览器)在服务器端划分一个区域,该区域用于存储该客户端...
回答的也多数都是:引用System.Web,不要用
Http
Context
.Current.
Application
应该用System.Web.
Http
Context
.Current.
Application
,后来在网上看到一篇关于System.Runtime.Remoting.Messaging.Call
Context
这个类的详细介绍才知道,原来
Http
Context
.Current是基于System.Runtime.Remoting.Messaging.Call
Context
这个类,子线程和异步线程都无法访问到主线程在Call
Context
中保存的数据。所以在异步执行的过程会就会出现
Http
Co
void
Application
_Start(object sender, EventArgs e)
// Code that runs on
application
startup
string st=
Http
Context
.Current.Request.ContentEncoding.BodyName.ToString();
Http
Context
.Current.Response.Write(st);
void
Application
_End(object sender, EventArgs e)
// Code that runs on
application
shutdown
void
Application
_Error(object sender, EventArgs e)
// Code that runs when an unhandled error occurs
void
Session
_Start(object sender, EventArgs e)
// Code that runs when a new
session
is started
void
Session
_End(object sender, EventArgs e)
// Code that runs when a
session
ends.
// Note: The
Session
_End event is raised only when the
session
state mode
// is set to InProc in the Web.config file. If
session
mode is set to StateServer
// or SQLServer, the event is not raised.
void
Application
_BeginRequest(object sender, EventArgs e)
Response.Write("\t\n<br>"+
Http
Context
.Current.Request.Url.ToString());
</script>
一. 基本认识
1. 简介:
Http
Context
用于保持单个用户、单个请求的数据,并且数据只在该请求期间保持;
也可以用于保持需要在不同的
Http
Modules和
Http
Handlers之间传递的值;
用户会话级的
Session
application
的缺点是在读取时最好
使用
lock,unlock,损失性能的很。所以它适用那些不需要经常改动的,但又需要每个用户都可以读取到的.数据。
cache就是具有所有
application
的优点,然后又有自己的特点
1.基于依赖性的终止.
使用
关键字作为依赖项,关键字一变,cach...
Application
_Start 网站启动时候触发,只执行一次
Application
_End 网站关闭时候触发,只执行一次
Session
_Start 创建
session
时候触发
Session
_End 销毁
session
时候触发
Application
_Error
IIS请求流程
Http
请求到达IIS服务器后,
Http
RunTime作为入口,
Http
RunTime类的ProcessRequest方法。
Http
RunTime包含着所有的
Http
请求信息(ProcessRequest方法
的
Http
WorkRequest参数)。
IIS服务器依赖
HTTP
.SYS驱动监听
Http
请求。IIS在操作系统启动时候再
HTTP
.SYS中注册自己的虚拟路径(URL访问返回404在这一步执行确定)
URL通过验证,
HTTP
.SYS交给IIS的w3wp.exe执行。然后IIS接收返回的数据流,返还给
Http
.sys,最后由
HTTP
.SYS 返回浏览器。
Http
请求的处理过程是通过管道(托管模块Module和处理程序Handlers组成)
创建
Http
WorkRequest对象,包含所有的
HTTP
请求信息
Http
WorkRequest将请求传递给
Http
RunTime的ProcessRequest方法,
Http
RunTime创建
Http
Context
对象,并且用
Http
WorkRequest进行初始化。
Http
RunTime调用
Http
Application
Factory的Get
Application
Instance方法创建
Http
Application
(
Http
Application
继承自I
Http
Handler,应用程序对象池中是否存
在
Http
Application
,存在返回不存在New返回)
maxRequestLength表示ASP支持的最大请求大小,而maxAllowedContentLength指定IIS支持的请求中内容的最大长度。因此,要上传大文件,我们需要同时设置这两个参数:较小的那个“优先”,即最终支持上传的文件的大小根据maxRequestLength和maxAllowedContentLength中的较小值而定。
如果文件长度小于maxAllowedContentLen...
I
Http
Handler 可以
使用
session
,但需要在实现 I
Http
Handler 的类中手动启用
session
可以通过实现接口 IReadOnly
Session
State 或 I
Session
State 来启用
session
。
IReadOnly
Session
State 接口表示 I
HTTP
Handler 实现类只需要读取
session
数据,而不会修改
session
数据。IRequires
Session
State 接口表示 I
HTTP
Handler 实现类需要读取和修改
session
数据。
以下是一个实现了 IRequires
Session
State 接口的 I
Http
Handler 示例:
```csharp
public class MyHandler : I
Http
Handler, IRequires
Session
State
public void ProcessRequest(
Http
Context
context
)
// 读取
session
数据
var myValue =
context
.
Session
["MyKey"];
// 修改
session
数据
context
.
Session
["MyKey"] = "NewValue";
public bool IsReusable => false;
需要注意的是,如果
使用
了
session
,那么在处理请求时需要保证线程安全。可以
使用
lock 来实现线程安全。另外,
使用
session
会增加服务器的负载,需要注意性能问题。