2011-05-18 102 views
9

我有一个简单的WCF服务,通过提供用户名和密码让客户/消费者应用程序登录。如果用户名和密码都正确,则WCF服务为客户端提供一个GUID。然后将GUID和用户名作为键/值对存储在WCF服务中。从这里开始,客户发送他们的GUID作为识别的一种手段。默认情况下WCF服务是无状态的吗?

因为我在Dictionary/Hashmap中存储了键/值对,所以这种方法只有在WCF服务是有状态的时才有效。问题是,它们是默认的状态,还是有一些我必须做的使它们以这种方式行事?

+3

WCF服务应该是无状态的 - 使您免于许多棘手的问题和头痛。被接受的“最佳实践”是使用“每个呼叫”方法 - 每个呼叫是一个全新的独立操作,完全独立于之前的任何其他呼叫。 – 2011-05-18 20:24:08

+0

@marc_s:我得到的服务确实是无状态的,但我不确定如何存储用于识别使用该服务的客户端的键/值对。我应该将这些临时值存储在数据库中而不是Dictionary/Hashmap中吗? – rafale 2011-05-18 20:28:49

+2

我只是将用户名/密码传递给每个呼叫。如果这太难以验证每次:从第一次调用传回一些标识符,并将该标识符存储在“当前有效用户”或类似的表中。在随后的调用中,只需传入该“标识符”并将其与“当前有效用户”表进行核对 – 2011-05-18 20:31:43

回答

9

按呼叫服务是Windows Communication Foundation默认实例化模式。所以,默认情况下,WCF服务不保持状态。正如马克所言,在WCF服务中保存状态存在潜在的问题。我强烈建议听取他的建议。

这个article描述了处理WCF实例管理的各种方法,包括如何维护你所要求的状态。

Juval Lowy优秀的WCF服务编程(link)的第4章详细介绍了更多细节。

+0

我相信对于支持会话的渠道,默认是PerSession? – Jeremy 2011-05-18 20:46:30

+0

我从Juval Lowy的文章中获取了这些信息:http://msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2 – 2011-05-18 20:48:14

+0

有趣的是,我再次查找并得到了不同的答案:http:// msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode.aspx不知道哪一个是正确的:) – Jeremy 2011-05-18 21:16:40

4

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

您必须使用wsHttpBinding或wsDualHttpBinding,然后将ServiceContract的会话模式(MSDN link)设置为允许或需要。 进入更多的细节。

相关问题