文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>asp.net asax文件使用与计数器实例

asp.net asax文件使用与计数器实例

时间:2011-01-18  来源:秩名

application对象(httpapplicationstate 类型,译者按:application对象是httpapplication类的一个属性,是web应用程序全局唯一的,web应用程序第一次有请求进来的时候创建的) 是我们在web应用程序内保存全局信息的地方,application对象是一个很方便的保存全局信息的地方,例如保存数据库教程的连接字符串:

 private void page_load(object sender, system.eventargs e)

{

  string connectionstring = application["connectionstring"].tostring();

  . . . 

}

 

你也可以在httpapplication类中声明静态成员变量来保存应用程序状态信息,例如,上例中的数据库连接字符串可以用如下方式保存。

public class global : system.web.httpapplication

{

  public static readonly string connectionstring = "connection information";

   . . .   

}


可以在asp教程.net代码的任何地方访问该静态成员变量,例如:string connectionstring = global.connectionstring;

非常重要的一点是,如果你想让该字符串可以全局范围内被访问到,则该字符串必须声明为静态成员变量(你也可以创建一个静态的属性)。

相反,如果你在global类型使用一般成员变量(非静态),则只能用来保存请求状态,举个例子来说明,下面的代码将在调试窗口中输出所有请求的处理时间(毫秒)

public class global : system.web.httpapplication

{

       protected datetime beginrequesttime;

       protected void application_beginrequest(object sender, eventargs e)

       {

              beginrequesttime = datetime.now;

       }

       protected void application_endrequest(object sender, eventargs e)

       {

              string messageformat = "elaps教程ed request time (ms) = {0}";

              timespan difftime = datetime.now - beginrequesttime;

              trace.writeline(

                     string.format(messageformat, difftime.totalmilliseconds       ) );                  

       }

       . . .

}


 好,现在让我们回到上面关于保存应用程序状态的话题。那个方法更好的呢:在application对象中保存对象的引用,还是在global类中声明静态成员或属性?各种方式各有优劣。在global类中保存全局静态成员可以使你的数据访问具有强类型,不象application对象,你不需要进行类型转换,下面的代码说明了它们的区别:
dataset cacheddata = (dataset)application[“mydataset”];

string mystring = application[“mystring”].tostring();

 

dataset cacheddata = global.mydataset;

string mystring  = global.mystring;

 

  强类型使你的的代码更加清晰和强壮,在应用程序性能要求比较高的情况下,这种方式可以避免运行时类型转换带来的性能损失。如果你保存的是值类型的数据,强类型还可以避免装箱(boxing)和卸箱(unboxing)所带来的性能损失。另外,application对象还有因为线程同步造成的锁定所带来的性能上问题。如果你的全局数据只初始化一次,再也不会改变,使用global类中的静态成员可以避免锁定带来的性能损失。但,如果你采用了这种方式,强烈推荐你使用访问器(属性),以保证该变量是只读的。如果你既要读又要写在global类中的静态成员变量,记住要保证线程安全。application对象通过获取读写锁已经内在的提供了线程安全保证。


看一下利用asax文件做网站计数器

添加了global.asax,app_code文件夹下global.asax.cs,文本文件site_counter.txt并写入数字0,代码分别如下:

global.asax

<%@ application inherits="linker.global" language="c#" %>
global.asax.cs

using system;
using system.data;
using system.configuration;
using system.web;
using system.web.security;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.webcontrols.webparts;
using system.web.ui.htmlcontrols;
using system.io;

namespace linker
...{
    /**//// <summary>
    /// global 的摘要说明
    /// </summary>
    public class global : httpapplication
    ...{
        public global()
        ...{
            //
            // todo: 在此处添加构造函数逻辑
            //
         }
        protected void application_start(object sender, eventargs e)
        ...{
            // 在应用程序启动时运行的代码
             streamreader rd = new streamreader(server.mappath("site_counter.txt"));
             application.lock();
             application["site_counter"] = int.parse(rd.readline());
             application.unlock();
             rd.close();
         }
        protected void session_start(object sender, eventargs e)
        ...{
            // 在新会话启动时运行的代码
             application.lock();
             application["site_counter"] = convert.toint32(application["site_counter"]) + 1;
             application.unlock();

             streamwriter wt = new streamwriter(server.mappath("site_counter.txt"), false);
             application.lock();
             wt.writeline(application["site_counter"]);
             application.unlock();
             wt.close();
         }
     }
}
然后在需要显示的页面显示系统 就可以了

比如简单的:

label_site_counter.text = convert.tostring(application["site_counter"]);

标签分类:

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载