WCF 服务默认是无状态的吗?

Posted

技术标签:

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

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

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

【问题讨论】:

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

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

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

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

【讨论】:

我相信支持会话的频道的默认设置是 PerSession? 我从 Juval Lowy 的文章中获取了这些信息:msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2 有趣,我又查了一遍,得到了不同的答案:msdn.microsoft.com/en-us/library/…不确定哪个是正确的:) 我认为 Brian S. 的回答消除了困惑:***.com/questions/6050929/…【参考方案2】:

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

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

【讨论】:

以上是关于WCF 服务默认是无状态的吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中,一个类组件可以是无状态的,而现在使用 Hooks 一个函数组件可以是有状态的吗?

带有 JWT 的 Spring Security Oauth2 真的是无状态的吗?

为啥 JWT 是无状态认证?

为什么说http协议是无状态的?

如何理解“RESTful API 是无状态的”?

如果资源服务器应该是无状态的,如何使用 websocket 将消息发送到队列