【发布时间】:2011-03-31 13:07:18
【问题描述】:
当我部署我的网站时,我发现我可以将文件夹转换为虚拟文件夹或 Web 应用程序,我对这两个概念完全感到困惑。
为什么有两种不同的类型?
每个的目的是什么?
【问题讨论】:
-
最近换了Tomcat。我发现它的概念更少,部署模型更清晰。
标签: iis
当我部署我的网站时,我发现我可以将文件夹转换为虚拟文件夹或 Web 应用程序,我对这两个概念完全感到困惑。
为什么有两种不同的类型?
每个的目的是什么?
【问题讨论】:
标签: iis
虚拟文件夹或虚拟目录只是指向服务器上某处物理文件夹的链接。该文件夹成为网站结构的一部分,您可以在 URL 的路径部分使用虚拟目录。在虚拟目录中执行的代码将在与其父级相同的“应用程序”中执行。
应用程序是在该“文件夹”内运行的代码具有自己的会话状态和应用程序状态的地方。它实际上是一个新的独立应用程序,位于根应用程序之下。
例如,如果您要将 ASP.NET 应用程序部署到具有名为 /myapp 的应用程序文件夹的站点中,那么该应用程序将拥有自己的应用程序域、会话状态、应用程序状态,与另一个 ASP.NET 完全分离在/ 中运行的应用程序。例如:如果您在根应用程序中设置应用程序值Application["Thing"] = 123,然后在/myapp 中使用不同的值进行相同操作,则根中的Application["Thing"] 不会被/myapp 中的赋值覆盖。
您可以使用应用程序做的另一件事是指定要在其下运行的不同应用程序池。例如,您的根 / 应用程序可能包含一个 ASP.NET 2.0 应用程序并在为 .NET 2.0 配置的池中运行。但是,您可能希望运行用 ASP.NET 4.0 编写的博客或论坛应用程序。现在,由于您不能在同一个应用程序池中混合 ASP.NET 运行时版本,因此您可以专门为 ASP.NET 4.0 应用程序指定一个备用应用程序池。
应用程序也可以像虚拟目录一样运行,您可以将应用程序文件夹指向服务器上其他位置的物理文件夹。
如果您对 IIS7 上的虚拟目录和应用程序的底层机制感兴趣,请查看我不久前发布的这个答案:
Using ServerManager to create Application within Application
【讨论】:
为 Kev 很好地提到的内容添加信息细节 - 默认情况下,所有虚拟目录都在名为 DefaultAppPool 的预定义应用程序池下运行。每当您在 Windows 中启用此功能时,DefaultAppPool 默认随 IIS 提供。对于 WebApps,您始终可以创建新的/新的 appPools 并在新创建的 appPool 中运行您的 webApp。这些 appPools 为您提供物理/单独的进程空间(以工作进程的形式),当 WebApp 定义了自己的 appPool 时,IIS 能够在这些空间的帮助下,以孤岛形式向 WebApp 提供会话状态、应用程序状态等服务。每当您的 webApp 的 appPool 崩溃时,其他 webApp(使用他们自己的自定义 appPool)或虚拟目录(使用 DefaultAppPool appPool)完全不受影响。
【讨论】: