2012-04-01 101 views
3

这个问题在标题中非常多,但我会详细说明。多个客户端调用WCF服务时,一个或多个AppDomains是否创建了服务器端?

我有一个Silverlight应用程序,充当一个稍微扩展的用户界面。

我的程序的主要部分将运行在服务器上以保持共享数据库的一致性。

这是我的问题来了:两个客户端调用WCF服务每个都获得该服务中的线程,或者他们会得到一个完整的AppDomain?

区别在于,如果第一种情况是他们可以轻松共享数据库,但在第二种情况下他们不能 - 据我了解。

编辑:这是因为数据库使用身份映射模式[福勒],其中使用的对象保存在物理内存(静态单身变量) - 多个AppDomains会搞砸了。

(我问我的大学老师并搜查了不少询问这之前,看似简单的问题)

+0

这个问题可能有一些关系,但我没有设置多个appdomains开始:http://stackoverflow.com/questions/7984803/multiple-instances-of-service-across-appdomains – 2012-04-01 18:26:50

+0

每个传入的请求将得到它自己的服务类的新实例来处理请求(在默认的每次调用场景中) - 但不是它自己的应用程序域,据我所知。因此,两个请求将是服务类 – 2012-04-01 18:42:13

回答

1

为WCF服务的线程模型被配置为您服务ConcurrencyMode确定:http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode.aspx

关于AppDomains - 完全取决于您如何托管您的服务。如果您正在手动运行您自己的ServiceHost,除非您决定开始管理并自行启动,否则服务器端总是只有一个AppDomain。

如果您在IIS内托管......它取决于IIS如何处理请求。它可以重用1个AppDomain,它可以启动多个AppDomain(除非您重写web.config中的设置,以允许每个工作进程只有1个AppDomain),或者它可以启动多个物理工作进程(这本质上隐含了多个AppDomain)您启用了网络花园模式。

所有这一切说,我不确定为什么这会影响您的数据访问策略。多线程或AppDomain应该没有共享数据库的问题。

+0

的两个单独的独立副本。因此,除非我专门选择IIS,否则将只有一个AppDomain,其中每个调用线程都可以像其他人一样访问相同的单例。 (我应该在我的问题中更加精确;我有一个ID映射模式 - 我编辑它) – 2012-04-01 19:04:48

+1

它确实是一个或另一个:IIS或自托管....您必须始终选择。 ...在处理IIS时,由于我提到的原因,静态数据(或单例)通常是危险的。与自我托管你正在处理恰好1个AppDomain,所以是的,共享单身人士没有问题。 – Jeff 2012-04-01 19:18:13