Application_Start 和 Application_OnStart 之間的區別
我正在將 ASP.NET MVC 程式碼添加到預先存在的 ASP.NET Webforms 項目中。各種教程建議將路由添加到從 Global.asax 中的 Application_Start() 呼叫的方法中。我的 Global.asax 已經有一個 Application_OnStart(Object,EventArgs) 方法和一些設置程式碼。
如果我嘗試同時使用 Start 和 OnStart,則不會呼叫 OnStart(並且設置失敗,導致錯誤)。看來我必須選擇其中之一。
我的問題是:我應該使用哪一個?它們之間有什麼區別?他們在不同的時間被叫到嗎?
(注意:在撰寫本文時,前三名的 谷 歌點擊是無用的和/或誤導的。我希望 Stack Overflow 可以解決這個問題。)
在經典(舊版)ASP 中,如果在 global.asa 文件中定義了一些特殊的函式名稱,它們將在應用程序生命週期的指定時間點執行。這些定義為:
- Application_OnStart - 執行一次,當您的應用程序收到第一個 HTTP 請求時,並且在處理任何 .ASP 文件之前。
- Application_OnEnd - 在應用程序關閉期間,在處理完所有請求後執行一次。
- Session_OnStart - 在每個唯一使用者會話開始時執行。如果使用者/客戶端禁用了 cookie,這將針對每個請求執行,因為 ASP 從未檢測到標識現有會話的會話 cookie。
- Session_OnEnd -(理論上!)每次使用者會話到期時執行。祝你好運。
這些基本上是硬連線到經典的 ASP 執行時 - 您不能更改它們,也不能將任何其他方法附加到這些事件。
在 ASP.NET 中,有一種叫做反射的東西
AutoEventWireup,它使用反射來查找符合特定命名約定的方法,並執行這些方法以響應 ASP.NET 執行時引發的匹配事件。最常見的範例是該Page_Load方法,該方法會在頁面生命週期內響應 Page 類觸發 Load 事件而自動呼叫。相同的技術用於將處理程序附加到應用程序級生命週期事件。它將查找名為 ModuleName_EventName 或 ModuleName_OnEventName 的方法,不帶參數
()或(object sender, EventArgs e)這是有趣的部分 -如果您定義了多個匹配方法,則僅執行文件中最新出現的匹配方法。(基本上最後一種方法獲勝)
因此,如果您的 global.asax.cs 看起來像這樣:
public class Global : System.Web.HttpApplication { protected void Application_Start() { Debug.WriteLine("A: Application_Start()"); } protected void Application_Start(object sender, EventArgs e) { Debug.WriteLine("B: Application_Start(object sender, EventArgs e)"); } protected void Application_OnStart() { Debug.WriteLine("C: Application_OnStart()"); } protected void Application_OnStart(object sender, EventArgs e) { Debug.WriteLine("D: Application_OnStart(object sender, EventArgs e)"); } }您將在調試輸出中看到消息 D;如果您註釋掉該塊中的最後一個方法,您將看到消息 C。
所以 - 使用您喜歡的任何命名約定,但如果您定義多個,則只會執行源文件中最後出現的一個。我個人會堅持,
Application_Start(object sender, EventArgs e)因為這是由 Visual Studio 項目模板和大多數 .NET 設計/編碼工俱生成的簽名。