如何在ASP.NET應(yīng)用程序中初始化(2)_ASP教程
推薦:程序員看淘寶,如何用Session保存用戶狀態(tài)網(wǎng)上購物已經(jīng)成為現(xiàn)在生活不可缺少的一部分。我們上淘寶只是為了消費,今天換一個角度,用程序員的眼光看看淘寶。 如上圖: 情況一:當(dāng)打開一些和賬戶有關(guān)的網(wǎng)頁,檢測用戶沒有登錄,系統(tǒng)自動會跳轉(zhuǎn)到登錄界面。 情況二:當(dāng)檢測到已經(jīng)有用戶登錄,頁面會自動跳轉(zhuǎn)到目的
其實就是一個登錄頁面,后臺代碼為:
- protected void btnLogin_Click(object sender, EventArgs e)
- {
- bool ok = false;
- using( SqlConnection connection
- = new SqlConnection(AppInitializer.MyNorthwindConnectionSetting.ConnectionString) ) {
- connection.Open();
- // 其它的數(shù)據(jù)庫操作。
- ok = true;
- }
- if( ok )
- Response.Redirect("Default2.aspx");
- }
你沒有想到的Global.asax怪事!
或許有些人會這樣寫他們的初始化代碼:
- void Application_Start(object sender, EventArgs e)
- {
- //在應(yīng)用程序啟動時運行的代碼
- try {
- AppInitializer.Init();
- }
- catch( Exception ex ) {
- LogException(ex);
- // .....................
- }
- }
這段代碼有什么問題呢?
其實問題的線索在于:為什么要加try....catch語句,是因為知道可能會發(fā)生異常嗎?
如果真有異常情況發(fā)生,這樣處理后,后續(xù)的請求是不是會發(fā)生各種想像不到的錯誤?
顯然這里不能吃掉異常,要不然后面的請求肯定會有問題,因為它們依賴的設(shè)置沒有正確的初始化。
好吧,那我去掉 try.....catch語句,這樣總該行了吧:
- void Application_Start(object sender, EventArgs e)
- {
- //在應(yīng)用程序啟動時運行的代碼
- AppInitializer.Init();
- }
還是看來一下真實的運行情況吧。

噢,抱歉,我還真忘記了配置連接字符串,這個異常提示太給力了。
現(xiàn)在就加上連接字符串嗎?
別急,想像一下,如果這個網(wǎng)站是一個真實的在線網(wǎng)站,會是什么情況呢?
答案有二種:
1. 另一個用戶也發(fā)起了一次請求。
2. 當(dāng)前用戶看到錯誤頁面后,重新刷新了一次當(dāng)前頁面。
現(xiàn)在我用Opera來扮演第二個瀏覽用戶吧,還是打開同樣的網(wǎng)址。

太奇怪了,第二個用戶居然能打開頁面,好吧,讓他登錄試試。

結(jié)果第二個用戶看到的錯誤情況和第一個用戶完全不同。
如果此時第一個用戶刷新他的瀏覽器,發(fā)現(xiàn)頁面又可以顯示了,然而登錄時,會看到與第二個用戶一樣的異常信息。
這個示例代碼實在太簡單了,我想維護(hù)人員根據(jù)NullReferenceException這個線索找下去,很快就能找到答案。如果初始化代碼再復(fù)雜一些,比如SetSqlDependency()中出現(xiàn)異常呢,那么程序仍然能夠正常運行,但是我們期望的緩存依賴可能就沒有效果了,最終可能會產(chǎn)生性能問題,排查的難度就會大多了。
記得以前做項目時,就遇到過這種情況,當(dāng)時感到很奇怪,為什么刷新一下就沒黃頁了,不過后面的錯誤就很折騰人了,最終也讓我總結(jié)了這個教訓(xùn)。所以我建議:如果在初始化階段出現(xiàn)了異常,干脆就別讓程序繼續(xù)運行了,每個請求都直接顯示黃頁,直到排除故障為止。
如何保證初始化異常一直顯示?
當(dāng)初始化發(fā)生異常時,如何保證初始化異常一直顯示呢?
方法其實并不難,我們需要修改一下代碼:
- private static Exception s_initException;
- void Application_Start(object sender, EventArgs e)
- {
- try {
- AppInitializer.Init();
- }
- catch( Exception ex ) {
- // 記下初始化的異常。
- s_initException = ex;
- }
- }
- protected void Application_BeginRequest(object sender, EventArgs e)
- {
- // 如果存在初始化異常,就拋出來。
- // 直到開發(fā)人員發(fā)現(xiàn)這個異常,并已解決了異常為止。
- if( s_initException != null )
- throw s_initException;
- }
現(xiàn)在不管有多少個用戶來訪問,或者第一個訪問者刷新瀏覽器多少次,都會看到同樣的異常信息:

說明:Global.asax的這個問題在IIS7以上版本的集成模式下并不存在。
分享:ASP.NET七大身份驗證方式及解決方案在B/S系統(tǒng)開發(fā)中,經(jīng)常需要使用身份驗證。因為web應(yīng)用程序非常特殊,和傳統(tǒng)的C/S程序不同,默認(rèn)情況下(不采用任何身份驗證方式和權(quán)限控制手段),當(dāng)你的程序在互聯(lián)網(wǎng)/局域網(wǎng)上公開后,任何人都能夠訪問你的web應(yīng)用程序的資源,這樣很難保障應(yīng)用程序安全性。通俗點來說:
- 程序員看淘寶,如何用Session保存用戶狀態(tài)
- ASP.NET七大身份驗證方式及解決方案
- 8 種提升 ASP.NET Web API 性能的方法
- asp.net計算每個頁面執(zhí)行時間的方法
- asp實現(xiàn)獲取MSSQL數(shù)據(jù)庫表指定條件行數(shù)的函數(shù)
- asp實現(xiàn)讀取數(shù)據(jù)庫輸出json代碼
- JScript中遍歷Request表單參數(shù)集合的方法
- 如何使用ASP建立虛擬的FTP服務(wù)器
- 用ASP+CSS實現(xiàn)隨機(jī)背景
- 簡述Xml.Serialization如何序列化對象到XML文件
- 如何過濾html中的回車空格
- ASP中的EVAL函數(shù)使用教程
- 相關(guān)鏈接:
- 教程說明:
ASP教程-如何在ASP.NET應(yīng)用程序中初始化(2)
。