IIS AppDomain 实例化

Posted

技术标签:

【中文标题】IIS AppDomain 实例化【英文标题】:IIS AppDomain instantiation 【发布时间】:2011-08-29 13:46:10 【问题描述】:

我在同一个虚拟目录下有一个网站和一个 Web 服务,并且一些网页调用该 Web 服务。

当调用 Web 服务时,IIS 是创建一个新的 AppDomain 还是在同一个 AppDomain 中运行 Web 服务?

有这个设置吗?在我的一台机器上,它似乎创建了一个新的 AppDomain。从集成与经典更改应用程序池模式是否会影响这一点?

【问题讨论】:

【参考方案1】:

IIS 应用程序池运行单个工作进程(默认情况下)。在该工作进程中,会为每个 IIS 应用程序(网站)创建一个 AppDomain。据我所知,在该 IIS 应用程序中执行的任何代码都将在相同的AppDomain 中运行(当然,除非您自己在代码中创建自己的子应用程序域)。您可以调整每个网站的工作进程数量,但实际上只有在您发现存在性能问题(无法通过隔离应用程序池来解决)时才这样做。如果您在每个网站上运行多个应用程序域,则在这些单独的应用程序域中运行的代码无法共享状态(例如 InProc 会话),并且只能通过序列化进行通信 - 并不理想。

关于 ASP.NET 和 WCF;当托管在 IIS 中时,它们默认以并行模式运行,在同一个 AppDomain 内,这允许它们共享状态,但 WCF 请求不由 ASP.NET 运行时处理,而是拦截对 WCF 服务的调用并由 WCF 运行时处理。 (尽管对 .svc 文件的调用最初仍通过 ASP.NET 进行路由)。在并行模式下,WCF 调用不遵守您可能为 ASP.NET 网站配置的配置、安全性、模拟等。

IIS 上的 WCF 也可以在 ASP.NET 兼容模式下运行,其中 WCF 实现由 http 处理程序管理,因此也由 ASP.NET 管道处理。如果您认为您的服务只需要 HTTP 支持,则可以考虑以兼容模式托管服务,以获得 ASP.NET 管道的强大功能和灵活性。

关于集成和经典管道模式,在集成模式下,ASP.NET 由w3wp.exe 作为 IIS 处理管道的集成部分运行。这意味着任何使用自定义处理程序等的内容,您可能已插入管道(即使在提供非 ASP.NET 内容时,例如 php),都将在同一 AppDomain 中加载和执行。

在经典模式下,ASP.NET 在其所有者工作进程aspnet_wp.exe 中运行,并作为 ISAPI 过滤器连接到 IIS 处理管道。我相信 AppDomain 用法的相同机制也适用于此。

【讨论】:

以上是关于IIS AppDomain 实例化的主要内容,如果未能解决你的问题,请参考以下文章

远程处理:从服务器 AppDomain 查找客户端 AppDomain / Assembly

为啥某些 .Net 程序集无法通过 AppDomain 的 GetAssemblies() 方法获得?

IIS 中是不是需要 AppDomain?

如何在单线程客户端中将 ComVisible 类实例化为自己的 AppDomain?

Azure 环境中的 IIS AppDomain 卸载

我可以在我的 IIS 托管网站中跨 AppDomain 共享 dll 吗?