我在采访中被问到这个问题......
1.如何识别我们要求的Web应用程序?
2.How iis认识到Web应用程序是开发的 哪种语言?
任何人都可以详细解释它们......
答案 0 :(得分:8)
我不会涵盖Web应用程序的范围,因为这不是您的问题,因此在整个答案中我将使用术语 Web应用程序或虚拟目录可互换。如果您想了解有关IIS上的Web应用程序的更多信息,那么来自IIS上的官方MS站点的文章: Understanding Sites, Applications, and Virtual Directories on IIS 7 将有所帮助。虽然标题确实说IIS7,但它也深入研究IIS6。
保持简单,您对服务器的请求包含虚拟目录,或者IIS已经配置为将请求映射到特定的虚拟目录。如果您请求的网址如下所示:
http://someServer/myWebSite/default.aspx
然后该URL的 myWebSite 部分是虚拟目录,IIS确切知道如何处理它,因为它直接映射到文件系统上的文件夹。但就像我说的那样,这只是一种简单的方法,而且您可能正在使用它来在您的开发机器或公司内部网上访问您自己的Web应用程序。还有另一种从URL中查找虚拟目录的方法 - 使用主机头。当您通过互联网向基于(基于IIS的)网站发出请求时,它最有可能与数十个甚至数百个其他网站托管在同一个Web服务器上。在这种情况下,主机头绑定用于将请求映射到特定的网站/ Web应用程序。您可以在本文中阅读有关主机标头的信息: HOWTO: IIS 6 Request Processing Basics, Part 2 - Web Site, Virtual Directory, and Web Application 。
页面的语言在页面本身中指定(在aspx或ascx文件中)。每当应用程序池工作程序进程第一次启动,或者回收(重新启动)web pages are recompiled时,页面或控件中指定的语言将用作使用哪个编译器的指南。然后将编译后的代码保存在临时存储中,直到文件发生变化,需要重新编译或再次回收工作进程。
如果它是预编译的,那么就没有必要知道页面语言,因为它已经被编译成一种名为MSIL(Microsoft中间语言,或者更正确CIL, Common Intermediate Language)的中间语言,然后这段代码被JIT编译在执行之前到本机代码。 (JIT汇编:simple explanation,wiki explanation,slightly more hardcore explanation)。
如果Web应用程序已经编译好,那么它已经是本机机器语言,因此根本不需要编译。
答案 1 :(得分:1)
关于问题#1,IIS使用它调用元数据库的东西来跟踪它托管的Web应用程序的信息,以及许多其他有用的信息。 IIS元数据库会跟踪标记为“应用程序”的任何节点,无论是整个网站,还是简单的子虚拟直接节点。每个应用程序都可以托管在应用程序池中...单独使用,或者许多应用程序可以共享单个池。 IIS提供了各种管理选项,包括WMI API,LDAP API,COM API和托管API(可用的API取决于IIS的版本... v7包括一些丰富的托管API以及广泛的PowerShell支持。)
说实话,我认为问题#2甚至不是一个有效的问题。 IIS本身并不关心用什么语言编写,因为IIS不负责编译任何东西。我认为这表明面试官并没有牢牢掌握他/她自己的概念。问题也可能是一个棘手的问题,正确的答案是“IIS没有能力,也不需要知道Web应用程序内置的语言类型,因为IIS不负责.NET的编译网站。“
另一方面,ASP.NET工作进程负责编译和执行ASP.NET应用程序。该语言通常由正在处理的文件顶部的@Page
指令标识。编译可以提前发生,将网站与.aspx,.ascx和任何其他处理程序文件一起呈现为.dll程序集,或者它可以实时发生,允许动态构建网站。后者要求ASP.NET运行时知道正在编译的页面的语言。
答案 2 :(得分:1)
简化版:
IIS能够插入ISAPI扩展(如SSL过滤器,压缩过滤器,PHP,ASP.NET等)。
1)IIS检查请求的URI并将其发送到已注册该URI路径的扩展。
ASP.NET默认注册*.ascx, *.ashx, *.aspx,...
个路径。
*.php
路径通常使用PHP扩展等注册。
2)现在,ASP.NET收到了第一个请求,ApplicationManager
类为我们的应用程序创建了一个应用程序域和一个HostingEnvironment
对象,其中包含信息和隔离(基于URI)。
3)核心对象被初始化(Http*
,如HttpRequest等。)
4)创建了一个HttpApplication
对象。
5)处理请求并返回响应(如果成功)。
2 - 4步只发生一次,这些对象驻留在内存中等待其他请求。