c#在线人数和访问次数终极版实现 - pyman

时间:2024-02-25 11:38:49

c#在线人数和访问次数终极版实现

历尽多少次的修改,终于得到终极版本。感觉自己真笨!废话少说,上源代码:

1、Global.asax文件中

public void Application_Start(Object S, EventArgs E)
    {
        Application["Counter"] = 0;
        //\'第一次启动Application时将CurrentUsers归零
        Application["CurrentUsers"] = 0;


    }
    public void Session_Start(Object S, EventArgs E)
    {
        //\'On_line标志设成False,表示第一次连接到该站点
        Session["On_line"] = false;  //  \'第一次连接,所以赋值false
        Session["On_line2"] = false;   //\'避免多人连接时候在没有超时又再重新加载页面出错准备。详细见jishuqi.inc的on_line2
        //\'指定Session的TimeOut属性(默认值是20分钟)
        Session.Timeout = 10;
        Application.Lock();
        //\'每有一人连接,CurrentUsers便加一,并且解锁
        Application["CurrentUsers"] = System.Convert.ToInt32(Application["CurrentUsers"]) + 1;
        Application.UnLock();
    }
    public void Session_End(Object S, EventArgs E)
    {
        Application.Lock();
        //\'每有一人离线,CurrentUsers便减一
        Application["CurrentUsers"] = System.Convert.ToInt32(Application["CurrentUsers"]) - 1;
        Application.UnLock();
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
        // 或 SQLServer,则不会引发该事件
    }
    public void Application_End(Object S, EventArgs E)
    {
    }

 

2、在count.aspx文件中

protected void Page_Load(object sender, EventArgs e)
    {   

        Label5.Text = Request.UserHostAddress;//ip地址
        Label1.Text = Application["CurrentUsers"].ToString();
        // Label2.Text = Application["countall"].ToString();        
        //以下为修改后的计数器
        string app_path = Server.MapPath(".") + "\\" + "jsq_ms.cnt";
        //判断是否存在计数器文件
        if (File.Exists(app_path) == false)//
        {
            StreamWriter txtWriter = File.CreateText(Server.MapPath(".") + "\\" + "jsq_ms.cnt");//生成文件,开始记录
            txtWriter.WriteLine(1);//写行,定为1
            txtWriter.Close();
        }
        string counter_file = app_path;
        string HitRate, tempNo, imgName; // \'HitRate是点击率
        StreamReader txtReader = File.OpenText(counter_file);
        HitRate = txtReader.ReadLine().Trim();//读行
        txtReader.Close();
        //如果符合条件
        if (Session["On_line2"] !=null )//20110519原先这里判断为==null,要更改为!=null才可以执行,写计数的行        {
            Session["On_line2"] =true ;
            tempNo = System.Convert.ToString(System.Convert.ToInt32(HitRate) + 1);//中间取得值      
            StreamWriter txtWriter = File.CreateText(counter_file);
            txtWriter.WriteLine(tempNo);//写行
            txtWriter.Close();
        }
       
        //Label2.Text = HitRate;//文字形式输出
        if (!IsPostBack) //对付分页重复输出 所以问是否第一次加载,这句很重要
        {
            for (int i = 1; i <= HitRate.Length; i++)//图形方式输出
            {
                imgName = HitRate.Substring(i - 1, 1);//因为从0开始计算位置的,所以i-1
                // Response.Write("<img src=\'images/" + imgName + ".gif\'>");
                Label2.Text = Label2.Text + "<img src=\'images/" + imgName + ".gif\'>";
            }
        }
    }

小结:Global.asax放在根目录就可以。其他的ascx可重复使用组件可以放在文件夹,也可以同一根目录

Global.asax 文件是 ASP.NET 应用程序的中心点。它提供无数的事件来处理不同的应用程序级任务,比如用户身份验证、应用程序启动以及处理用户会话等。你应该熟悉这个可选文件,这样就可以构建出健壮的ASP.NET 应用程序。

Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法。你可以使用这个文件实现应用程序安全性以及其它一些任务。让我们详细看一下如何在应用程序开发工作中使用这个文件。 概述 Global.asax 位于应用程序根目录下。虽然 Visual Studio .NET 会自动插入这个文件到所有的 ASP.NET 项目中,但是它实际上是一个可选文件。删除它不会出问题——当然是在你没有使用它的情况下。.asax 文件扩展名指出它是一个应用程序文件,而不是一个使用 aspx 的 ASP.NET 文件。 Global.asax 文件被配置为任何(通过 URL 的)直接 HTTP 请求都被自动拒绝,所以用户不能下载或查看其内容。ASP.NET 页面框架能够自动识别出对Global.asax 文件所做的任何更改。在 Global.asax 被更改后ASP.NET 页面框架会重新启动应用程序,包括关闭所有的浏览器会话,去除所有状态信息,并重新启动应用程序域。 编程 Global.asax 文件继承自HttpApplication 类,它维护一个HttpApplication 对象池,并在需要时将对象池中的对象分配给应用程序。

事件被触发的顺序是:

·Application_BeginRequest

·Application_AuthenticateRequest

·Application_AuthorizeRequest

·Application_ResolveRequestCache

·Application_AcquireRequestState

·Application_PreRequestHandlerExecute

·Application_PreSendRequestHeaders

·Application_PreSendRequestContent

·<<所写的c#或vb执行代码>>

·Application_PostRequestHandlerExecute

 ·Application_ReleaseRequestState

·Application_UpdateRequestCache

·Application_EndRequest

这些事件常被用于安全性方面。

下面这个 C# 的例子演示了不同的Global.asax 事件,该例使用Application_Authenticate 事件来完成通过 cookie 的基于表单(form)的身份验证。此外,Application_Start 事件填充一个应用程序变量,而Session_Start 填充一个会话变量。Application_Error 事件显示一个简单的消息用以说明发生的错误。

protected void Application_Start(Object sender, EventArgs e)

{ Application["Title"] = "Builder.com Sample";

}

protected void Session_Start(Object sender, EventArgs e)

 { Session["startValue"] = 0;

}

 protected void Application_AuthenticateRequest(Object sender, EventArgs e)

{ // Extract the forms authentication cookie string cookieName = FormsAuthentication.FormsCookieName; HttpCookie authCookie = Context.Request.Cookies[cookieName];

 if(null == authCookie)

{ // There is no authentication cookie.

 return;

}

FormsAuthenticationTicket authTicket = null;

      try

    {

    authTicket = FormsAuthentication.Decrypt(authCookie.Value);

    }

       catch(Exception ex)

{ // Log exception details (omitted for simplicity) return;

}

if (null == authTicket)

 { // Cookie failed to decrypt.

return;

} // When the ticket was created, the UserData property was assigned // a pipe delimited string of role names. string[2] roles roles[0] = "One" roles[1] = "Two" //Create an Identity object FormsIdentity id = new FormsIdentity( authTicket ); // This principal will flow throughout the request. GenericPrincipal principal = new GenericPrincipal(id, roles); // Attach the new principal object to the current HttpContext object Context.User = principal;

}

protected void Application_Error(Object sender, EventArgs e)

{

Response.Write("Error encountered.");

}

这个例子只是很简单地使用了一些Global.asax 文件中的事件;重要的是要意识到这些事件是与整个应用程序相关的。