谁能解释 IIS 中应用程序池、工作进程和应用程序域之间的区别?另外,它们是如何协同工作的?我已经阅读了几篇文章,但仍然有些混乱。
- 在 IIS 中创建的每个网站都会成为应用程序吗?
- 每个应用程序是否与一个工作进程相关联?
- 应用程序域在哪里出现?
我试着用其他词来表达它们。
在服务器中,您可以拥有许多一起运行的 asp.net 站点。每个站点都是一个应用程序域。
您必须为他们每个人分配一个应用程序池。许多应用程序域(站点)可以具有相同的应用程序池,并且因为它们具有相同的应用程序池,所以它们在相同的进程和相同的帐户下运行 - 并且它们具有相同的池设置。如果此池重新启动,则该池下的所有站点都会重新启动。
现在每个池可以有一个或多个工作进程。每个工作进程都是运行您的站点的不同程序,有它们单独的静态变量,它们不同的启动停止调用等。不同的工作进程不会一起通信,交换数据的唯一方法是来自公共文件或公共数据库。如果您有多个工作进程并且其中一个进行长时间计算,那么另一个可以处理互联网呼叫并显示内容。
当您将许多工作进程分配给单个池时,您将创建所谓的网络花园,并且如果一台计算机是一台处理机器,您的站点就像从多台计算机上运行。
每个工作进程可以有许多线程。
更多工作进程对您的影响:
当您有一个工作进程时,一切都会变得更简单,在您的应用程序中,所有静态变量都是相同的,您可以使用lock
来同步它们。
当您分配多个工作进程时,您仍然继续使用lock
静态变量,静态变量在您的站点的许多运行中没有什么不同,如果您有一些公共资源(例如在磁盘上创建缩略图)那么您需要将您的工作进程与Mutex
.
再来一注。听起来,当您创建更多工作进程时,您可能会有更流畅的异步页面加载。asp.net 的会话处理程序存在一个小问题,即锁定页面加载的整个过程——这取决于你是否知道并处理它——或者改变它。
因此,让我们只讨论一个具有许多工作进程的站点。在这里,您面临需要将公共资源更改与Mutex
. 但是使用会话的页面/处理程序不是异步的,因为会话锁定了它们。这是一个很好的开始,因为您避免自己进行许多点的同步。
关于这个主题的一些问题:
Web 应用程序在处理共享同一会话的另一个 Web 应用程序时被阻止
对 Web 服务的 jQuery Ajax 调用似乎是同步的
ASP.NET 服务器不会异步处理页面
完全替换 ASP.Net 的会话
现在这个会话锁不会影响不同的站点。
在不同的站点中,更多的工作进程可以帮助一个站点不阻塞另一个运行时间较长的进程。
同样在不同的站点之间,更多的池也可以提供帮助,因为每个池至少有一个工作进程,但是请记住并使用进程资源管理器自己查看,每个工作进程占用您计算机的更多内存,以及一台具有 16G 内存的大型服务器并且一台 SQL 服务器不能有太多不同的工作进程——例如在有 100 个共享站点的服务器上,你不能有 100 个不同的池。
对 ASP.NET 开发人员的意义:为了使您的网站具有可扩展性,不要使用进程内会话,也不要使用静态类变量锁进行同步。
是的,虽然不是每个应用程序都是一个网站。您可以拥有一个嵌套在网站下的应用程序。
是的,每个应用程序都必须有一个工作进程(应用程序池),尽管一个应用程序池可以服务多个应用程序。可以分布式(网络花园/农场)单个 Web 应用程序,这意味着它将在多个进程中运行。
每个进程都将在自己的应用程序域中运行(每个应用程序池都是一个单独的应用程序域)。
来自 MSDN。
应用程序是网站根级别的一组内容或网站根目录下单独文件夹中的一组内容。
应用程序池定义一组一个或多个工作进程,并配置有通用设置,这些设置为分配给该应用程序池的一个或多个应用程序提供请求。因为应用程序池允许一组 Web 应用程序共享一个或多个类似配置的工作进程,所以它们提供了一种方便的方法来将一组 Web 应用程序与服务器计算机上的其他 Web 应用程序隔离开来。进程边界将每个工作进程分开;因此,一个应用程序池中的应用程序问题不会影响其他应用程序池中的网站或应用程序。应用程序池显着提高了 Web 基础架构的可靠性和可管理性。
来自源链接:-http://weblogs.asp.net/owscott/archive/2007/09/02/application-vs-appdomain.aspx
应用程序是 IIS 术语,但它是 ASP.NET 使用的术语。本质上,它创建了一个沙箱或一组边界,以将不同的站点或站点的一部分与其他站点分开。
AppDomain 是一个 .NET 术语。(在 IIS7 中,AppDomains 在 IIS 中发挥更大的作用,但在大多数情况下,它是一个 ASP.NET 术语)
工作进程用于处理 Web 应用程序的请求。