当我加载我的URL时,IIS实际上会发生什么?

3

首先,希望大家圣诞节快乐 :)

我过去几年一直是桌面应用程序开发人员,但现在我全职从事ASP.NET开发(工作变动 :))

在过去的几天中,我越来越好奇当一个新访客访问我的URL时实际上会发生什么。

我刚刚在一个相当简单的基于Signal R的应用程序上工作,并且需要一些单例对象在所有会话之间共享,在桌面上非常简单,但我完全不确定在Web上是否适用 :(

所以,这里是问题...

当5个人访问我的URL时,IIS实际上做了什么?他们都得到了应用程序的一个单独实例还是使用同一个?如果您能简单地解释一下,那将是非常棒的! :)

另外,假设我有一个包含静态单例的类库 - 是否为所有会话的唯一实例?

希望这有意义 :)

感谢任何帮助!

干杯。 ste.

2个回答

1

这被称为IIS生命周期
完整的细节必须直接从微软和IIS的创建者那里阅读。
并非所有的IIS都是相同的。

IIS 7.0生命周期概述

IIS 5.0和6.0生命周期概述

如果您在互联网上搜索,就会发现还有更多相关内容。

它们是否都使用应用程序的单独实例,还是使用同一个实例?

如果您对同一应用程序使用多个池(Web Garden),则请求会在不同池之间分配,否则一个池只能处理一个实例的页面。

该页面可以从不同的线程进行处理,但是会话上有全局锁定,因此如果您使用MS会话,则页面将按顺序进行处理(除了未使用会话的页面)

每个池都是一个实例,保存静态数据,并且对于来自该池的所有请求都是相同的。如果您使用两个池,则会有两组不同的静态数据。

关于会话锁的一些问题: 尝试使Web方法异步, 在共享同一会话的情况下处理另一个Web应用程序时Web应用程序被阻止


谢谢你给出的好答案,Web Garden 看起来很有趣。如果需要在整个 Web Garden 中使用Singleton模式处理某些对象,您会如何管理呢?也许可以使用内存共享对象来实现。 - Steoates
@Steoates 我只发现了一个常见数据库的实用解决方案。也许还有一个共享对象,但我没有找到它。对于池之间的同步,我使用Mutex,对于同一池中的静态线程数据的同步,我使用lock。我还编写了完全自定义的会话模块,以避免锁定并使我的页面异步运行。 - Aristos

1

如果您使用默认的IIS安装,则将有一个应用程序池为所有请求提供服务。因此,静态单例将由您示例中的所有5个人共享。

但是,如果您需要扩展,则将拥有多个应用程序池。

应用程序池是应用程序的实例。

如果静态内容是数据库连接或类似内容,则建议您查看替代方法,以便不需要使用静态内容。如果它与用户感兴趣的业务相关,则最好寻找其他方法在客户端之间共享此内容,如果您需要进行扩展。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接