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