【问题标题】:One or more AppDomains created server-side when multiple clients call a WCF service?当多个客户端调用 WCF 服务时,一个或多个 AppDomain 在服务器端创建?
【发布时间】:2012-04-15 13:22:39
【问题描述】:

这个问题几乎在标题中,但我会详细说明。

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

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

这就是我的问题所在:调用 WCF 服务的两个客户端会各自在该服务中获得一个线程,还是他们会各自获得一个完整的 AppDomain?

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

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

(在问这个看似简单的问题之前,我问了我的大学老师并进行了相当多的搜索)

【问题讨论】:

  • 这个问题可能有一些关系,虽然我没有设置多个appdomains开头:stackoverflow.com/questions/7984803/…
  • 每个传入的请求都将获得自己的服务类的新实例来处理请求(在默认的每次调用场景中) - 但据我所知,不是它自己的 appdomain。所以两个请求将是服务类的两个独立的独立副本

标签: multithreading wcf service appdomain shared-data


【解决方案1】:

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

关于 AppDomains - 这完全取决于您托管服务的方式。如果您手动运行自己的 ServiceHost,则服务器端始终只有 1 个 AppDomain,除非您决定开始自己管理和启动。

如果您在 IIS 中进行托管...这取决于 IIS 处理请求的方式。它可能会重用 1 个 AppDomain,它可能会启动多个 AppDomain(除非您覆盖 web.config 中的设置以允许每个工作进程仅允许 1 个 AppDomain),或者它可能会启动多个物理工作进程(这本质上意味着多个 AppDomain),如果您已启用网络花园模式。

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

【讨论】:

  • 所以除非我特别选择 IIS,否则只有一个 AppDomain,其中每个调用线程都可以访问与其他线程相同的单例? (我的问题应该更准确;我有一个 ID-map 模式正在进行 - 我这样编辑它)
  • 这真的是一个或另一个:IIS 或自托管......你必须始终选择......在处理 IIS 时,由于我的原因,静态数据(或单例)通常是危险的提及。使用自托管,您正在处理 1 个 AppDomain,所以是的,共享单例是没有问题的。
猜你喜欢
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 2014-05-24
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多