3

首先,希望大家有一个愉快的圣诞节:)

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

所以在过去的几天里,我发现自己越来越想知道当说新访问者将访问我的 URL 时实际发生了什么......

我刚刚开发了一个非常简单的基于 Signal R 的应用程序,我需要在所有会话中共享一些单例,现在在桌面上非常简单,但我根本不确定网络:(

所以基本上,这是这个问题..

当说有 5 个人访问我的 URL 时,IIS 实际上做了什么,他们都获得了一个单独的应用程序实例还是使用同一个实例?如果你能把它分解成简单的术语,那就太棒了!:)

另外,假设我有一个具有静态单例的类库 - 它是所有会话中该类的唯一实例?

希望这是有道理的:)

谢谢你的帮助!

干杯。圣。

4

2 回答 2

1

这称为IIS 生命周期
必须从 Microsoft 和 IIS 的创建者处直接阅读完整的详细信息。
并非所有 IIS 都相同。

IIS 7.0 的生命周期概述

IIS 5.0 和 6.0 的生命周期概述

如果您在互联网上搜索,还有更多。

他们是否都获得了应用程序的单独实例,或者他们使用相同的实例

如果您为同一个应用程序(网络花园)使用多个池,那么它们的请求将在池之间拆分,或者一个池,一个实例负责处理页面。

该页面可以从不同的线程处理,但会话上有一个全局锁定,因此如果您使用 MS 会话,该页面将串行处理(预计没有使用会话的那个)

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

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

于 2012-12-21T08:13:21.323 回答
1

如果您有默认的 IIS 安装,那么您将拥有一个应用程序池来服务所有请求。因此,在您的示例中,所有 5 个人都将共享一个静态单例。

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

应用程序池是您的应用程序的一个实例。

如果静态是用于数据库连接和类似的,那么我建议你看看替代方法,这样你就不需要静态了。如果它与您的用户感兴趣的业务相关,那么如果您需要扩展,您最好寻找其他方式在客户之间共享它。

于 2012-12-21T08:48:07.817 回答