簡體   English   中英

.Net CLR如何識別哪個.DLL是Web應用程序中的主要(啟動)DLL?

[英]How does the .Net CLR identify which .DLL is the primary (startup) DLL in a web application?

我想知道CLR如何找到Web應用程序的入口點/主DLL。 CLR如何知道我的bin目錄中存在的多少DLL,是我網站 DLL?

我的web.config中沒有標識信息將一個程序集指定為我的“主要”程序集,那么這個選擇過程是如何發生的呢?

這個選擇/初始化過程如何工作?

這完全取決於您使用的是Web窗體還是MVC。 CLR本身沒有做任何事情來支持這一點,它是ASP.NET運行時和IIS正在完成所有的工作。

網絡表格

在Web表單中,您的.aspx和“代碼隱藏”使用類繼承來定義該關系。 @Page指令有一個Inherits屬性,用於定義ASPX將從哪個類繼承。 ASPX本身被編譯成一個動態類(或使用aspnet_compiler.exe預編譯)繼承該類型。

當IIS訪問ASPX頁面時,它會通過集成處理程序或aspnet_isapi處理程序將其傳遞給PageHandlerFactory

在這種情況下,沒有“啟動”DLL,它使用ASPX編譯的DLL。

MVC

當請求到達ASP.NET運行時時,它會查看是否存在與路由匹配的控制器。 然后,它使用DefaultControllerFactory嘗試將路由映射到控制器。 最終將調用GetControllerType來嘗試找到Controller的類型,它進一步深入到一個名為ControllerTypeCache的內部類型。

ControllerTypeCache完成了大部分魔術。 它使用EnsureInitialized初始化,其任務是填充使用BuildManager.GetReferencedAssemblies引用的所有程序EnsureInitialized的所有類型的列表。 然后它抓取每個程序集以查找與控制器匹配的類型,例如實現IController ,公共等。

.NET如何知道如何啟動MVC運行時

MVC運行時是一個HttpHandler。 IIS會直接將其自動傳遞給MVC處理程序(較新版本的框架和IIS會這樣做),或者您必須將MVC處理程序放在web.config的httpHandlers部分中。

在舊版本的MVC中,您必須手動注冊MvcHttpHandler 從ASP.NET 4.0開始,許多URL Routing guts被移植到ASP.NET框架本身,所以它現在有了這個開箱即用的處理程序。

與ASP.Net Web應用程序中的“啟動”DLL最接近的是包含`global.asax'的程序集(如果有的話)。 有關Web應用程序旋轉時發生的情況的詳細信息,請參閱IIS 7.0的ASP.NET應用程序生命周期概述

您還應該記住,可以在Web應用程序的頂部放置HttpModule實例。 您的Web應用程序可以將其自己添加到堆棧中。 請求通過HttpModules堆棧傳遞,每個請求都有機會攔截,處理,篡改您的請求等。一旦做出響應,堆棧中它上面的每個模塊都獲得相同的機會隨着回應。

我打算評論你對@VCJones的優秀解釋(這個東西通常只是假設這是一個很好的學習時刻 - 所以對你的問題也感到榮幸!)。

那么,我們是否首先進入MVC運行時?

通過閱讀此MSDN文檔我的理解文件匹配首先發生在請求的資源上,然后是路由匹配(和它的處理程序 - MVC / Web API)


你的問題促使我修補:)並用默認的腳手架啟動了一個新的MVC應用程序,為About創建了一個控制器:

public ActionResult About()
{
    return View();
}

在應用程序的根目錄中創建了一個名為About.cshtml的物理文件。 我擺弄了路由配置,以便控制器名稱不會成為路由的一部分 - 例如http://localhost:123/about (不是http://localhost:123/home/about )。 所以現在我有

  1. About視圖
  2. app根目錄中的About.cshtml物理文件(不是/Views/Home/那個)

測試: http://localhost:123/About

  • 第一個結果:MVC控制器被解雇了。 等等,我以為是先匹配文件?
  • 然后,如果我導航到http://localhost:123/About.cshtml一個奇怪的異常: The type of page you have requested is not served because it has been explicitly forbidden. The extension '.cshtml' may be incorrect. The type of page you have requested is not served because it has been explicitly forbidden. The extension '.cshtml' may be incorrect. 什么 我沒有大量的cshtml視圖嗎?
  • 然后我在web.config看到了這個設置:
    • <add key="webpages:Enabled" value="false"/> - 如果我將此更改為true怎么辦?

結果:

異常消失(不再禁止),現在我可以看到MSDN文檔中描述的行為。 此時我無法提出About viewhttp://localhost:123/about ),因為文件存在 (並且是response ),並且我沒有進入路由匹配(因此MVC處理程序不是'解雇了)。

這是我的理解 ,所以如果我錯了,我相信這里有人會指出它,另一個學習時刻會發生:)

暫無
暫無

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

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