Application状态
Application状态为应用程序提供了一个全局的状态所有客户都可以使用该状态从设计的角度来说我们通常用Application来存储一些标准的数据同时我们在使用它时要注意避免性能的降低存储的数据尽可能提供给客户只读的功能
我们可以使用HttpApplication类的Application属性来访问Application状态它返回一个HttpApplicationState类的实例这个类是一个对象集合可以存储任何类型的数据并以键/值对的形式存储一旦数据被存储到状态后就不会删除除非应用程序重新启动或者被终止或回收
我们可以在Globalasax的Application_Start函数中存储数据
void Application_Start(object src EventArgs e)
{
int exp = ;
// population of dataset from ADONET query not shown
// Cache DataSet reference
Application[Experiment] = exp;
}
现在你可以在任意页面下使用它
private void Page_Load(object src EventArgs e)
{
int expr = IntParse((Application[Experiment]));
}
由于Application状态对于所有客户都是共享的如果客户只是读取该数据则没有什么问题一旦要进行写操作就不能保证线程的安全以及出现同步争用的问题我们可以使用HttpApplicationStateLock类它派生于ReadWriteObjectLock类它提供了读/写锁的两种属性在ASPNet下隐式地调用了AcquireWrite()和AcquireRead()方法以保证避免上面的问题当然我们也可以显示地使用Lock()和Unlock()
private void Page_Load(object sender SystemEventArgs e)
{
ApplicationLock();
int expr = IntParse((Application[Experiment]));
if (expr>=something)
{
//do something
}
Else
{
//do something else
}
ApplicationUnLock();
//Some other thing goes here
}
sessioncookieview状态
sessioncookieview状态都是用来保存客户端信息的它们之间又有什么区别呢?
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 = IntParse(Session(Value));//Accessing from it
if (expr>=something)
{
//do something
}
Else
{
//do something else
}
//Some other thing goes here
}
既然Session State针对特定的客户建立通过它来识别客户的请求AspNet提供了一种加密机制和编码算法生成自己的Session Key这是非常必要的因为知道了你的Session Key就有权限访问指定的页面了
在ASPNet中生成Session Key的方法
byte[] sessionkey = new byte[];
//Generates a random number
RNGCryptoServiceProvider rngkey = new RNGCryptoServiceProvider ();
rngkeyGetBytes (sessionkey);
string clientsessionKey = SessionIdEncode (sessionkey);
但是Session和客户端的Cookie是有关的当客户关掉Cookie时Session就失效了
不过在ASPNet
中可以在nfig中修改设置使Session的传递脱离Cookie方法是
<configuration>
<systemweb>
<sessionState cookieless=true />
</systemweb>
</configuration>
对于Cookie大家并不陌生每个Cookie存储了多个名/值对我们可以通过HttpCookie类的值集合来访问它也可以间接地通过类所提供的索引器访问Cookie在ASPNet下的使用
protected void Page_Load(Object sender EventArgs E)
{
int expr = ;
if (RequestCookies[Expr] == null)
{
// Expr cookie not set set with this response
HttpCookie cokExpr = new HttpCookie(Expr);
cokExprValue = exprTextBoxText;
ResponseCookiesAdd(cokExpr);
expr = ConvertToInt(exprTextBoxText);
}
else
{
// use existing cookie value
expr = ConvertToInt(RequestCookies[Expr]Value);
}
// use expr to customize page
}
由于Cookie存储的信息是放到客户端的用户在访问服务器端页面时必然在客户端和服务器端之间频繁交换信息影响了程序的性能而Session由于存储在服务器内存中因此不存在这个问题不过Session存储的信息是临时的用户一旦关闭浏览器状态即失去而Cookie则相反
至于View State主要是指控件和页面的状态信息它以_VIEWSTATE值传递给服务器端
有兴趣的可以看我另外一篇文章ASPNet中控件的EnableViewState属性
ApplicationSession和Cookie可以借用Carfield的总结
COOKIE 是本地文件是 大盗在阿里巴巴家做的记号或者是送牛奶的人在你家门口钉的箱子
SESSION 是服务器端内存是你洗澡时浴池发给你的钥匙自己专用可以开自己的好多箱子
APPLICATION 是公共浴池在这里能看见所有人包括 ppmm 哦)