我想知道CLR如何找到Web应用程序的入口点/主DLL。 CLR如何知道我bin
目录中存在的DLL中的哪个DLL是我网站的 DLL?
我的web.config
中没有标识信息指定一个程序集作为我的"主要"汇编,那么这个选择过程是如何发生的?
此选择/初始化过程如何工作?
答案 0 :(得分:4)
这完全取决于您使用的是Web窗体还是MVC。 CLR本身没有做任何事情来支持这一点,它是ASP.NET运行时和IIS正在完成所有的工作。
在Web表单中,您的.aspx和“code behind”使用类继承来定义该关系。 @Page指令有一个Inherits
属性,用于定义ASPX将从哪个类继承。 ASPX本身被编译成一个动态类(或使用aspnet_compiler.exe预编译)继承该类型。
当IIS访问ASPX页面时,它会通过集成处理程序或aspnet_isapi处理程序将其传递给PageHandlerFactory
。
在这种情况下,没有“启动”DLL,它使用编译ASPX的DLL。
当请求到达ASP.NET运行时时,它会查看是否存在与路由匹配的控制器。然后,它使用DefaultControllerFactory
尝试将路由映射到控制器。最终会调用GetControllerType
来尝试找到Controller的类型,它进一步深入了解一个名为ControllerTypeCache
的内部类型。
ControllerTypeCache
完成大部分魔法。它使用EnsureInitialized
进行初始化,其任务是填充使用BuildManager.GetReferencedAssemblies
引用的所有程序集中的所有类型的列表。然后它会抓取每个程序集以查找与控制器匹配的类型,例如实现IController
,公开等等。
.NET如何知道启动MVC运行时
MVC运行时是一个HttpHandler。 IIS直接将其直接传递给MVC处理程序(较新版本的框架和IIS执行此操作),或者您必须将MVC处理程序放在web.config的httpHandlers部分中。
在旧版MVC中,您必须手动注册MvcHttpHandler
。从ASP.NET 4.0开始,许多URL Routing guts被移植到ASP.NET框架本身,所以它现在有了这个开箱即用的处理程序。
答案 1 :(得分:0)
ASP.Net Web应用程序中与'启动'DLL最接近的是包含`global.asax'的程序集(如果有的话)。有关Web应用程序旋转时会发生什么的详细信息,请参阅ASP.NET Application Life Cycle Overview for IIS 7.0。
您还应该记住,可以在您的网络应用上放置一大堆HttpModule
个实例。您的Web应用程序可以将其自己添加到堆栈中。请求通过HttpModules
堆栈传递,并且每个请求都有机会拦截,处理,篡改您的请求等。一旦做出响应,堆栈中它上面的每个模块都会获得与回应相同的机会。
答案 2 :(得分:0)
我打算评论你对@VCJones出色的解释的评论(这些东西通常只是假设所以它是一个很好的学习时刻 - 所以也对你的问题感到荣幸!)。
那么,我们如何首先进入MVC运行时?
我的理解从阅读此MSDN doc 文件匹配首先发生在请求的资源上,然后路由匹配(并且&#39) ; s处理程序 - MVC / Web API)
你的问题促使我修补:)并用默认的脚手架启动了一个新的MVC应用程序,为About
创建了一个控制器:
public ActionResult About()
{
return View();
}
和还在应用程序的根目录中创建了一个名为About.cshtml
的物理文件。我摆弄了路线配置,以便控制器名称不会成为路线的一部分 - 例如http://localhost:123/about
(不是http://localhost:123/home/about
)。所以现在我有了
About
查看About.cshtml
物理文件(不是/Views/Home/
中的那个)测试:http://localhost:123/About
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.
什么?我没有cshtml
次观看次数? web.config
中看到了这个设置:
<add key="webpages:Enabled" value="false"/>
- 如果我将其更改为true
结果:
异常消失(不再禁止),现在我可以看到MSDN doc中描述的行为。此时我无法提升About
view
(http://localhost:123/about
),因为文件存在(并且是response
) ,我没有进入路线匹配(所以MVC处理程序没有被解雇)。
这是我的理解,所以如果我错了,我相信这里有人会指出它,并会发生另一个学习时刻:)