【问题标题】:Are WCF services stateless by default?WCF 服务默认是无状态的吗?
【发布时间】:2011-08-28 09:05:35
【问题描述】:

我有一个简单的 WCF 服务,它允许客户端/消费者应用程序通过提供用户名和密码来登录。如果用户名和密码都正确,WCF 服务会为客户端提供一个 GUID。然后将 GUID 和用户名作为键/值对存储在 WCF 服务中。从这里开始,客户端将其 GUID 与每个请求一起发送,作为识别手段。

由于我将键/值对存储在 Dictionary/Hashmap 中,因此这种方法仅在 WCF 服务是有状态的情况下才有效。问题是,它们在默认情况下是有状态的,还是我必须做些什么才能使它们以这种方式运行?

【问题讨论】:

  • WCF 服务应该是无状态的 - 让您免于许多棘手的问题和头痛。公认的“最佳实践”是使用“每次调用”方法——每次调用都是全新的、独立的操作,完全独立于之前的任何其他调用。
  • @marc_s :我拥有的服务确实是无状态的,但我只是不确定如何存储用于识别使用该服务的客户的键/值对。我应该将这些临时值存储在数据库中而不是 Dictionary/Hashmap 中吗?
  • 我只会将用户名/密码传递给每个呼叫。如果每次都很难验证:从第一次调用中传回一些标识符,并将该标识符存储在“当前有效用户”表或类似的表中。在随后的调用中,只需传入该“标识符”并对照“当前有效用户”表进行检查

标签: c# wcf stateless stateful


【解决方案1】:

每次调用服务是 Windows Communication Foundation 默认的实例化模式。因此,默认情况下,WCF 服务不维护状态。正如 Marc 所说,在 WCF 服务中保存状态存在潜在问题。我强烈建议听从他的建议。

article 描述了在 WCF 中处理实例管理的各种方法,包括如何按照您的要求维护状态。

Juval Lowy 出色的 Programming WCF Services (link) 第 4 章更详细地介绍了。

【讨论】:

【解决方案2】:

默认情况下它们是无状态的,如果可能的话,我强烈建议保持这种状态。但是,如果由于某种原因您无法启用,您可以启用状态。

您必须使用 wsHttpBinding 或 wsDualHttpBinding 然后将 ServiceContract (MSDN link) 的 SessionMode 设置为允许或必需。 更详细。

【讨论】:

    猜你喜欢
    • 2011-09-11
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2012-11-08
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    相关资源
    最近更新 更多