日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HttpApplication类及派生的Global类

發布時間:2023/12/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HttpApplication类及派生的Global类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HttpApplication派生的Global?類有很多用處,包括管理應用程序狀態和請求狀態

Visual Studio.NET?創建的global.asax文件為每個web?應用程序生成一個從HttpApplication類派成的Global類,這個類包含很多事件處理程序,例如Application_Start?Session_Start.

?

???????或許有人認為每個web應用程序只有一個Global類的實例。事實上,在大多數應用程序框架中,代表”Application”的對象都是singleton –?就是說只有一個實例存在。我們也知道ASP.NET運行時只有在應用程序開始的時候才調用Application_Start事件處理方法。所有這些好像都在暗示,在我們的ASP.NET Web應用程序中只有一個Global對象的實例,但是所有這些確確實實是誤導!

???????ASP.NET?運行時(ASP.NET runtime,以下簡稱“運行時“)維護了一個HttpApplication對象池。當一個請求進來的時候,運行時從該池中取出一個HttpApplication對象來服務于當前請求,該HttpApplication對象一直和該請求相關聯,且只和該請求相關聯,直到請求被處理完畢。當請求完成后,運行時把該對象歸還到池中,稍后會從池中再次取出去服務于另外的請求?–?但一個請求每次只能和某一個HttpApplication對象相關聯。

Application?State?vs?Request?State

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 = "Elapsed 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對象通過獲取讀寫鎖已經內在的提供了線程安全保證。

???????比較安全的初始化全局靜態成員變量的地方是在Application_Start事件處理程序中。即使全局范圍有很多個Global對象的實例,運行時只會在Global對象第一次創建的時候調用Application_Start事件處理程序。

???????比較理想的初始化請求狀態變量的地方是Application_BeginRequest,請求狀態變量一般情況下不需要線程安全,因為每個Global對象在同一時刻只服務于一個請求

轉載于:https://www.cnblogs.com/JoinZhang/archive/2010/08/12/1798082.html

總結

以上是生活随笔為你收集整理的HttpApplication类及派生的Global类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。