【问题标题】:Shared read-only data in WCF - choosing InstanceContextModeWCF 中的共享只读数据 - 选择 InstanceContextMode
【发布时间】:2016-09-26 10:29:23
【问题描述】:

我有一个 WCF 服务需要访问只读信息存储库。此存储库的创建成本很高,这意味着它需要创建一次并在服务类的服务调用/实例之间共享。使类线程安全通常不是问题,就像使存储库线程安全一样。我正在考虑共享存储库的两种选择:

  1. 只需将“InstanceContextMode”设置为“Single”,将“ConcurrencyMode”设置为“Multiple”,手动创建单个服务对象并通过构造函数将单个存储库注入其中。

  2. 使用设置为“PerCall”(或“PerSession”)的“InstanceContextMode”并为我的服务实现自定义服务实例提供程序。作为创建过程的一部分,此实例提供程序可以将存储库的单个实例注入所有服务类实例(构造函数)。

鉴于我的情况(前提是我已提交足够的相关信息),这里不使用选项 1 的原因是什么?对我来说,这似乎是最简单的?我一直在阅读将“InstanceContextMode”设置为“Single”对性能/可扩展性不利,但我无法掌握这种情况是否总是如此,或者它是否取决于服务属性。

如前所述,我意识到我可能没有就我的具体案例提供足够的信息,让你们任何人都无法回答。

最好的问候, 约翰

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    需要访问只读信息存储库的 WCF 服务。此存储库的创建成本很高,这意味着它需要创建一次并在服务类的服务调用/实例之间共享

    上述情况更可能是您必须使用缓存机制的情况,而不是您必须使用“InstanceContextMode”的情况。

    所以你应该可以通过使用MemoryCache 来实现这一点。您可以将只读对象加载到内存缓存中,并在并发 Web 服务调用之间安全地共享它们。

    【讨论】:

    • 感谢您的回答!这听起来像是一个不错的选择,并且与解决方案#2(多个实例)具有相同的主题。但是如果#1 是一个糟糕的解决方案,我仍然感兴趣,如果它是:为什么?对我来说,理解这部分很重要。
    • 在我看来,#1 不好,因为它使您的服务成为单线程的。如果你在一个 API 中使用这种模式,它可以被多个系统或设备访问,你的 Api 将变得几乎无法使用。根据 MSDN,Single:每个实例上下文一次最多允许有一个线程处理实例上下文中的消息。希望使用相同实例上下文的其他线程必须阻塞,直到原始线程退出实例上下文。
    • 这不是对“ConcurrencyMode”和该设置的“Single”选项的描述吗?在#1 中,我打算将“ConcurrencyMode”设置为“Multiple”,将“InstanceContextMode”设置为“Single”。对我来说,这意味着单个对象将用于服务所有服务调用,并且该单个对象将被多个调用同时使用。当然,这需要线程同步。
    • 是的。错过了“多个”部分。如果将并发模式设置为多个,所有并发调用将共享同一个实例。但是在这种情况下,您的实例将永久(几乎)保留在内存中,并且在您重新启动服务之前不会被垃圾收集。所以你会有潜在的记忆问题。
    • 这是一个很好的观点。我会考虑的!是否还有其他问题,性能/可扩展性或其他问题,您认为我应该考虑?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多