ASP .网中有两个重要的对象,一个是应用对象,一个是会议对象。
应用:记录应用程序参数的对象,该对象用于共享应用程序级信息。
会话:记录浏览器端的变量对象,用来存储跨网页程序程序的变量或者对象。
说实话,写了快一年的ASP.NET应用程序对象还真没怎么用过。看了看书,根据这两个对象的特性写了一个简单的聊天室程序。真的是非常的简陋。
我的思路是,有两个页面默认页和聊天室页,页面布局如图:
默认页:
聊天室页:
思路大概就是,在默认页登录时,输入的昵称存入会议对象当中,并跳转到聊天室页,并把会议中存的键为"昵称"存入应用对象中去。遍历应用对象,给左侧的列表框添加在线人的昵称。利用应用对象在会话_开始和会话结束方法中对键为"计数"进行1,-1用于记录当前在线人数。在利用应用对象键为"内容"存储聊天记录。
下面上代码
Global.asax:
复制代码代码如下:受保护的作废申请_开始(对象发送方,EventArgs e){应用程序[' count ']=0;应用程序['内容']='聊天记录 n ';}
受保护的无效会话开始(对象发送者,事件参数){应用程序lock();应用程序['计数]=(int)应用程序['计数']1;申请UnLock();}受保护的无效会话结束(对象发送者,事件参数){应用程序lock();应用程序['计数]=(int)应用程序['计数']-1;申请UnLock();}
Default.aspx:
复制代码代码如下:受保护的作废按钮_登录_点击(对象发送者,EventArgs e) { if(!字符串IsNullOrEmpty(textbox _昵称。文本){会话['昵称']=文本框_昵称。文字;}回应。重定向(' ChatRoom。aspx’);}
聊天室。aspx:
复制代码代码如下:受保护的无效页面_加载(对象发送者,事件参数e) { label_count .文本='当前在线人数为应用程序['计数']。'' ToString()'人;if(!IsPostBack) { if (Session['昵称']!=null){ 0应用程序。添加(会话['昵称']。ToString(),会话['昵称']);}文本框_记录.文本=应用程序['内容']。ToString();}列表框_用户名.项目。清除();应用程序中字符串。目录){ if(!字符串等于('内容')!字符串。等于('计数')!字符串。等于('名称){ listbox_usernames .添加新的列表项(应用程序[字符串]。应用程序[字符串]。ToString()));} } }
受保护的作废按钮_发送_点击(对象发送者,EventArgs e) { if (Session['昵称']!=null){ 0应用程序['内容']=(会话['昵称']。' ToString()'说:“textbox_sendmsg .文本 n ');文本框_记录。文本=应用程序['内容']。ToString();} }
受保护的无效按钮_退出_点击(对象发送者,事件参数){应用程序。移除(会话['昵称']。ToString());应用程序['计数]=(int)应用程序['计数']-1;回应。重定向(' Webcounter。aspx’);}
这样简单的聊天室就完成了,在本地使用的时候,在一个浏览器下好像不会创建新的会话,需要在不同浏览器下登录才能看到效果。
这里也要注意一点就是,在退出聊天室的时候,要把应用键为"昵称",即当前会话["昵称"]的值给移动掉。否则刷新列表框的时候,会发现退出的昵称还存在。
同时也要把键为"计数"的应用对象-1,也许你要问,不是在会话结束方法中已经-1了么?这块我还真不确定,可能是有两个原因,不知道是哪个?希望明白的朋友给予指点。
1.会话尚未过期。我刚刚在应用程序中杀死了密钥为session的对象,但是我不知道真正的session。将不调用会话结束方法。(但也许你会问,把当前会话[“昵称”]对象留空不是可以吗?我试过这个,但是count没有-1。) 2.会不会是因为我在两个不同的本地浏览器上做这个聊天操作?
在一些特殊情况下,使用应用对象确实对我们有帮助,所以我不需要谈论session,这绝对是我们经常使用的。