簡體   English   中英

Application_start 不起作用

[英]Application_start not working

我在global.asax文件的application_start()方法中編寫了一些代碼。 當我在IIS服務器上部署我的應用程序時,它不會被調用。 當我在 .NET 框架中運行代碼時,它是可訪問的。

我已經多次嘗試重新啟動該應用程序,但它仍然無法正常工作。

我也嘗試了以下鏈接中的建議。

Application_Start 沒有觸發?

在嘗試調試Appplication_Start之前,您需要了解幾件事。 有 -

一:代碼何時執行以及為什么幾乎不可能通過附加到它來調試。

應用程序啟動方法在應用程序池啟動並且您的網站第一次啟動時執行。 如果您將新的交付物部署到 IIS,則 IIS 可能會自行重新啟動它,但不能保證它會重新啟動。 因此,部署新代碼並不能保證它會重新啟動池並啟動應用程序的執行。 您應該重新啟動應用程序池以保證應用程序啟動的執行。

在調試 IIS 應用程序時,Visual Studio 將自身附加到一個名為w3wp.exe或類似的進程(我忘記了實際的可執行文件名稱),它是工作進程,只有在您的應用程序池啟動並且您的站點之后才可用,記住之后向上。 因此,換句話說,如果您在服務列表中看到這個,那么應用程序啟動已經被執行並且附加到它不會給您調試它的機會。 這是一場與時間的拉鋸戰。

因此,換句話說,除非您非常非常快,否則調試應用程序啟動是不可能的。

二、解決方案1——使用Dev Server

在 Visual Studio 中使用 Asp.net 開發服務器或 IIS express 啟動您的應用程序,然后您就可以進行調試了。 但是如果你真的想在 IIS 上調試,那么檢查下一節

二、解決方案2——用IIS

有一個名為System.DiagnosticsDebugger的庫,它有一個很好的方式在代碼中調用調試器。 你可以在這里閱讀 - http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.break(v=vs.110).aspx

修改您的應用程序開始於此 -

public void Application_Start(){
    ....... //other codes
    Debugger.Break() or Debugger.Launch()
}

當這一行執行時,IIS 將停止執行,並會顯示一個調試器選擇器窗口(類似於附加的那個)在此處輸入圖片說明 ,保持你的解決方案在 vs 中打開並從列表中選擇那個 vs,將能夠像往常一樣調試...... :)

如果您使用的是 Windows 8 並且調試器未啟動,請閱讀本文以啟用它 -

http://blogs.msdn.com/b/mapo/archive/2013/11/07/debugger-launch-not-displaying-jit-debugger-selection-popup-on-windows-8-8-1.aspx

三:很重要的一點

我注意到您說,您正在 Application_Start 中添加 db 條目。 您應該記住, Application_Start 沒有HttpContextViewContext ,因此您的數據庫訪問代碼可能由於許多其他原因而失敗。

確保Global.asax文件實際部署到根目錄中的目標文件夾。 如果該文件不存在,則永遠不會調用您為Application_Start編寫的代碼。

還要確保簽名正確

public class Global : System.Web.HttpApplication {
   protected void Application_Start(object sender, EventArgs e) {/*do something here like logging so you know it was called*/}
}

如果您運行的是 Server 2008R2(或更早版本)和/或 IIS 7.5,您可能需要查看應用程序初始化模塊。 這可以在這里下載:

www.iis.net/downloads/microsoft/application-initialization

對於 8.0 之前的 IIS 版本,在第一個 Web 請求到達之前不會調用應用程序啟動。 我正在閱讀您的問題,因為您希望在第一個 Web 請求之前開始觸發您的應用程序,是嗎?

這是配置此模塊的絕佳指南(如果它適用於您): https : //blogs.msdn.microsoft.com/benjaminperkins/2014/01/07/configure-the-iis-application-initialization-module/

關鍵要點是您需要將應用程序池設置為“AlwaysRunning”而不是“OnDemand”。 您還需要為您的網站設置一個 preloadEnabled 標志。 完成這兩項操作后,啟動 iisreset,您應該會看到應用程序啟動的結果(查看數據庫,因為它在那里寫入)。

其他答案也是相關的,因為這很難調試,並且您錯過了您習慣的所有細節,例如應用程序啟動中的 httpcontext。

如果您運行的是 IIS 8.0 - 您仍然應該閱讀上面的鏈接來配置預加載。

這對我有用:

  • 菜單 -> 構建 -> 清潔解決方案
  • 菜單 -> 構建 -> 重建解決方案

然后,Application_Start() 僅第一次被觸發。

在我的情況下,在生產環境中 App_global.asax.compiled 丟失,並且 global.asax 的所有內容都沒有被觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM