IIS 应用程序池和缓存

3

我创建了一个公共列表,可以从我的Web应用程序运行和访问。

private static List<x> _x;
static readonly object lockObjx = new object();

public static void XCache()
{
            if (_x != null)
                return;

            lock (lockObjx)
            {
               _x = GetFromDatabase();
            }
}

所有这些都可以在默认应用程序池下运行得很愉快。现在我需要添加一个Web服务来更新此缓存。如果不行,那么有没有一种方法可以在不安装类似于MEMCache的东西的情况下完成此操作?该服务和Web应用程序在同一台服务器上运行。

2个回答

5
为了使其工作,您需要将服务放在与Web应用程序相同的ASP .NET应用程序中。这通常意味着在IIS中运行它们在同一站点中。
每个ASP .NET应用程序都有自己的AppDomain。每个AppDomain都有自己的所有对象的副本,包括静态引用。换句话说,数据不在AppDomain之间共享,因此即使它们在同一个IIS进程(AppPool)中运行,也不会被单个应用程序在IIS中共享。
这里有一篇很好的文章:http://odetocode.com/Articles/305.aspx。它可能有点旧,但仍然有效。

1
缓存和会话是特定于AppDomain(而不是App Pool)的。不同的Web应用程序将始终具有不同的App Domain,即使它们在同一个应用池下运行。因此,它们将具有单独的缓存、单独的会话、单独的对象、单独的静态引用等。然而,有一种方法可以在同一应用程序池内的不同应用程序之间共享缓存/对象:在同一AppPool中的应用程序之间共享变量?

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