注册 登录
编程论坛 ASP.NET技术论坛

asax文件使用

等待冰柠檬 发布于 2010-03-24 02:05, 871 次点击
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Xml.Linq;

namespace WzJyw.asax
{
    public class Onle : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            //在应用程序启动时运行的代码
            Application["online"] = 0;  //初始化在线人数变量值
        }

        protected void Session_Start(object sender, EventArgs e)
        {
            //在新会话启动时运行的代码,新会话开始表示有新的用户加入
            Application.Lock();  //锁定Application
            int NUM = (int)Application["online"] + 1;
            Application.Set("online", NUM); //修改对象值,为自身+1
            Application.UnLock(); //解除对象锁定
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {
            //在会话结束时运行的代码
            //注意:只有在Web.config文件中的sessionstate模式设置为
            //Inproc时,才会触发Session_End事件.如果会话模式设置为StateServer
            //或SQLServer,则不会触发该事件
            Application.Lock();  //锁定Application
            int NUM = (int)Application["online"] - 1;
            Application.Set("online", NUM); //修改对象值,为自身+1
            Application.UnLock(); //解除对象锁定
        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

我想把在线人数显示在Label上 但是不可以 大家帮忙下 谢谢了
    public partial class Head2 : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            lblOnle.Text = Application["online"].ToString(); //显示在线人数
            Response.AddHeader("Refresh", "30"); //设置30秒刷新一次
        }
    }
8 回复
#2
yms1232010-03-25 09:21
怎么不可以了?显示不出来?
#3
sj8982010-03-25 10:59
Application.Get["online"] 你试试。
#4
等待冰柠檬2010-03-26 00:56
还是不可以 都显示对象未实例化
#5
yms1232010-03-26 09:05
你的Web.config怎么写的?
#6
lch04162010-04-16 21:40
我做过这个系统的,要是你还没要的话可以跟我联系的,我的QQ是345802833
#7
visolleon2010-04-25 20:07
以下是引用lch0416在2010-4-16 21:40:51的发言:

我做过这个系统的,要是你还没要的话可以跟我联系的,我的QQ是345802833

解决问题! 问题出来是拿来分析的。
#8
visolleon2010-04-25 20:18
楼主说的问题不是太清楚!我不知道楼主会不会调试?
发现论坛里的很多人都不是太会调试程序!
很多帖子的问题都是“对象未实例化 ”

我觉得出现这个问题,很多是大家在写程序根本不考虑程序执行的时候的各种情况,只考虑怎么去实现程序,然后了事。
就拿这段代码来说下:
程序代码:
        protected void Session_Start(object sender, EventArgs e)
        {
            //在新会话启动时运行的代码,新会话开始表示有新的用户加入
            Application.Lock();  //锁定Application
            int NUM = (int)Application["online"] + 1;
            Application.Set("online", NUM); //修改对象值,为自身+1
            Application.UnLock(); //解除对象锁定
        }

首先最大的问题就在于:在Application.Lock()后,就能肯定在Application.UnLock()之前所执行的代码都不会出异常?
假如出异常,那么导致的情况是你的Aplication这次请求就一直在Lock状态了,那后面的操作会发生什么?
所以在这里,中间要加try {}catch{}。

第二点就是这句:

int NUM = (int)Application["online"] + 1;

这里就那么肯定Application["online"] 一定是有值的?不会是null? 假如IIS应用池回收了,那么Application["online"] 还会有值吗?肯定会抛出对象未实例化了哦。
还有这句也是一样:

Application["online"].ToString();


建议使用AS:

int num = Application["online"] as Int32;

#9
misswang2010-04-26 12:34
顶顶顶
1