asp.net asax檔案使用與計數器執行個體

來源:互聯網
上載者:User

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"]);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.