我有一个简单的WCF服务,通过提供用户名和密码让客户/消费者应用程序登录。如果用户名和密码都正确,则WCF服务为客户端提供一个GUID。然后将GUID和用户名作为键/值对存储在WCF服务中。从这里开始,客户发送他们的GUID作为识别的一种手段。默认情况下WCF服务是无状态的吗?
因为我在Dictionary/Hashmap中存储了键/值对,所以这种方法只有在WCF服务是有状态的时才有效。问题是,它们是默认的状态,还是有一些我必须做的使它们以这种方式行事?
我有一个简单的WCF服务,通过提供用户名和密码让客户/消费者应用程序登录。如果用户名和密码都正确,则WCF服务为客户端提供一个GUID。然后将GUID和用户名作为键/值对存储在WCF服务中。从这里开始,客户发送他们的GUID作为识别的一种手段。默认情况下WCF服务是无状态的吗?
因为我在Dictionary/Hashmap中存储了键/值对,所以这种方法只有在WCF服务是有状态的时才有效。问题是,它们是默认的状态,还是有一些我必须做的使它们以这种方式行事?
按呼叫服务是Windows Communication Foundation默认实例化模式。所以,默认情况下,WCF服务不保持状态。正如马克所言,在WCF服务中保存状态存在潜在的问题。我强烈建议听取他的建议。
这个article描述了处理WCF实例管理的各种方法,包括如何维护你所要求的状态。
Juval Lowy优秀的WCF服务编程(link)的第4章详细介绍了更多细节。
我相信对于支持会话的渠道,默认是PerSession? – Jeremy 2011-05-18 20:46:30
我从Juval Lowy的文章中获取了这些信息:http://msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2 – 2011-05-18 20:48:14
有趣的是,我再次查找并得到了不同的答案:http:// msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode.aspx不知道哪一个是正确的:) – Jeremy 2011-05-18 21:16:40
默认情况下它们是无状态的,我强烈建议尽可能保持这种状态。但是如果由于某种原因你无法启动,你可以启用状态。
您必须使用wsHttpBinding或wsDualHttpBinding,然后将ServiceContract的会话模式(MSDN link)设置为允许或需要。 进入更多的细节。
WCF服务应该是无状态的 - 使您免于许多棘手的问题和头痛。被接受的“最佳实践”是使用“每个呼叫”方法 - 每个呼叫是一个全新的独立操作,完全独立于之前的任何其他呼叫。 – 2011-05-18 20:24:08
@marc_s:我得到的服务确实是无状态的,但我不确定如何存储用于识别使用该服务的客户端的键/值对。我应该将这些临时值存储在数据库中而不是Dictionary/Hashmap中吗? – rafale 2011-05-18 20:28:49
我只是将用户名/密码传递给每个呼叫。如果这太难以验证每次:从第一次调用传回一些标识符,并将该标识符存储在“当前有效用户”或类似的表中。在随后的调用中,只需传入该“标识符”并将其与“当前有效用户”表进行核对 – 2011-05-18 20:31:43