• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> WEB开发 >> .NET 开发 >> 详细内容
 

推荐文章

 
 

热点文章

  • FckEditor远程图片下载插件
  • IIS过滤器实现.NET程序不破解DLL替换字符串一法
  • 为ASP.NET封装的SQL数据库访问类
  • Url地址重写,利用HttpHander手工编译页面并按需生成静..
  • ASP.NET2.0中文验证码的实现
  • asp.net生成缩略图及给原始图加水印
  • ASP.NET学习笔记一——ASP和ASP.NET比较
  • ASP.NET学习笔记二——简单Web控件使用
  • Ajax简单客户登陆验证
  • 获取指定IP的终端的MAC地址
  • 使用HtmlInputHidden 控件在本页面保持状态和跨页面传..
  • DoNet控件嵌套
 
 

相关文章

  • ASP.Net发邮件
  • asp.net datagrid实现多层表头
  • ASP.NET学习笔记二——简单Web控件使用
  • ASP.NET学习笔记一——ASP和ASP.NET比较
  • ASP.NET中利用VWD操作数据库
 
 

百度搜索

 
 

ASP.Net状态管理

  • 阅览次数:
  • 文章来源: CodePub整理
  • 原文作者:
  • 整理日期: 2008-04-22
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

Asp.Net提供了四种状态类型:application,session,cookie,view。

Application状态为应用程序提供了一个全局的状态。所有客户都可以使用该状态。从设计的角度来说,我们通常用Application来存储一些标准的数据。同时,我们在使用它时要注重避免性能的降低,存储的数据尽可能提供给客户只读的功能。

我们可以使用HttpApplication类的Application属性来访问Application状态,它返回一个HttpApplicationState类的实例。这个类是一个对象集合,可以存储任何类型的数据,并以键/值对的形式存储。一旦数据被存储到状态后,就不会删除,除非应用程序重新启动或者被终止或回收。

我们可以在Global.asax的Application_Start函数中存储数据:
void Application_Start(object src, EventArgs e)
{
int exp = 0;
// population of dataset from ADO.NET query not shown
// Cache DataSet reference
Application["Experiment"] = exp;
}

现在你可以在任意页面下使用它:

private void Page_Load(object src, EventArgs e)
{
int expr = Int32.Parse((Application["Experiment"]));
}

由于Application状态对于所有客户都是共享的,假如客户只是读取该数据,则没有什么问题,一旦要进行写操作,就不能保证线程的安全以及出现同步争用的问题。我们可以使用HttpApplicationStateLock类,它派生于ReadWriteObjectLock类,它提供了读/写锁的两种属性。在ASP.Net下,隐式地调用了AcquireWrite()和AcquireRead()方法以保证避免上面的问题。当然,我们也可以显示地使用Lock()和Unlock():

private void Page_Load(object sender, System.EventArgs e)
{
Application.Lock();
int expr = Int32.Parse((Application["Experiment"]));
if (expr>=something)
{
//do something
}
Else
{
//do something else
}
Application.UnLock();
//Some other thing goes here
}


session,cookie,view状态都是用来保存客户端信息的。它们之间又有什么区别呢?

Session状态是在客户登录的时候创建的,它保存了客户特定的信息,并以Session ID来标识。当一个新客户访问应用程序时,先生成一个新的Session ID(或是Session Key),并为同一个客户接下来的请求创建联系。你可以在Session State中存储任意类型的数据,作为你的应用,状态被同一个进程和AppDomain(App域)维护。Session State的特点是为每一个特定的客户创建状态以维护客户的信息,这些状态信息存储在服务器端的默认的会话状态配置中。

Session(“Value”) = expr ; // Storing the data into session object
SomeFunction()
{
int expr = Int32.Parse(Session(“Value”));//Accessing from it
if (expr>=something)
{
//do something
}
Else
{
//do something else
}
//Some other thing goes here
}

既然Session State针对特定的客户建立,通过它来识别客户的请求。Asp.Net提供了一种加密机制和编码算法生成自己的Session Key。这是非常必要的,因为知道了你的Session Key,就有权限访问指定的页面了。

在ASP.Net中生成Session Key的方法:

byte[] sessionkey = new byte[15];

//Generates a random number
RNGCryptoServiceProvider rngkey = new RNGCryptoServiceProvider ();
rngkey.GetBytes (sessionkey);
string clientsessionKey = SessionId.Encode (sessionkey);

但是Session和客户端的Cookie是有关的,当客户关掉Cookie时,Session就失效了。不过在ASP.Net
中可以在web.config中修改设置,使Session的传递脱离Cookie。方法是:
<configuration>
<system.web>
<sessionState cookieless="true" />
</system.web>
</configuration>


对于Cookie大家并不生疏,每个Cookie存储了多个名/值对,我们可以通过HttpCookie类的值集合来访问它,也可以间接地通过类所提供的索引器访问。Cookie在ASP.Net下的使用:
protected void Page_Load(Object sender, EventArgs E)
{
int expr = 0;
if (Request.Cookies["Expr"] == null)
{
// "Expr" cookie not set, set with this response
HttpCookie cokExpr = new HttpCookie("Expr");
cokExpr.Value = exprTextBox.Text;
Response.Cookies.Add(cokExpr);
expr = Convert.ToInt32(exprTextBox.Text);
}
else
{
// use existing cookie value...
expr = Convert.ToInt32(Request.Cookies["Expr"].Value);
}
// use expr to customize page
}

由于Cookie存储的信息是放到客户端的,用户在访问服务器端页面时,必然在客户端和服务器端之间频繁交换信息,影响了程序的性能。而Session由于存储在服务器内存中,因此不存在这个问题。不过,Session存储的信息是临时的,用户一旦关闭浏览器,状态即失去。而Cookie则相反。

至于View State,主要是指控件和页面的状态信息,它以_VIEWSTATE值传递给服务器端。有爱好的可以看我另外一篇文章:ASP.Net中控件的EnableViewState属性

Application、Session和Cookie,可以借用Carfield的总结:

COOKIE 是本地文件,是 40 大盗在阿里巴巴家做的记号,或者是送牛奶的人在你家门口钉的箱子。

SESSION 是服务器端内存,是你洗澡时浴池发给你的钥匙。自己专用,可以开自己的好多箱子。

APPLICATION 是公共浴池。在这里能看见所有人,包括 ppmm 哦:)。

上一篇:比AcdSee功能还强大的图片处理、编辑软件,推荐下载!
下一篇:ASP上传漏洞防范
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号