2010-01-22 53 views
1

我正在使用IIS托管我的WCF应用程序。为了服务某些方法,我需要一个对大量初始化的帮助对象的引用。一个好的方案是初始化一次并放入缓存中,然后所有请求只使用缓存中的对象。我如何做缓存?在不同服务主机中启动的wcf服务的常见缓存

最简单的方法是使用mywebmethod的静态字段。 IIS创建多个ServiceHosts来为请求提供服务。并且在每个servicehost中,静态字段将会不同。

我aso尝试使用System.Web.HttpRuntime.Cache。同样,我有一些独立的缓存。为了澄清,我需要不缓存请求的结果,但需要处理请求的一些中间数据。

那么有什么解决方案?

+0

我发现IIS的真正问题不在不同的服务主机中。他们可以通过HttpContext.Cache属性成功共享System.Web.Caching.Cache对象(至少适用于httpBindings)。 .Net为每个AppDomain创建一个Cache对象。如果IIS在AppPool中使用多个工作进程(在IIS 7中默认为10),它显然会自然创建100个AppDomain和10个单独的缓存。 – flashnik 2010-01-26 10:42:04

回答

1

在单独的AppDomain中运行不同的服务可为您提供崩溃保护和其他一些与安全相关的好处。如果您确定需要共享静态,请考虑使用自托管服务。

我只能想到使用IIS实现此目的的一种方法:实现一个ServiceHostFactory,它将返回将启动和停止多个ServiceHosts的自定义ServiceHost。但waaay太hacky是一块生产代码)

更新我今天偶然发现了这个,这个答案看起来像一团糟。如果不同的服务主机驻留在同一个IIS站点中,它们共享一个AppDomain,因此所有服务的静态字段应该相同。

+0

运行多个服务主机是否会带来性能优势? – flashnik 2010-01-22 15:39:59

+0

不,它只是把它们放到同一个appdomain中的一个棘手的方法,甚至不能确定你能够创建一个虚假的服务主机来封装它们。 再次,我会选择一个自我托管的选项。 – 2010-01-22 15:45:55

+0

有一件事让我无法运行自我托管的潜在性能损失,因为只有一个服务主机,因此与IIS中的几个servicehosta相比。 – flashnik 2010-01-22 15:48:47