是否可以在.NET WCF服务的上下文中分配持久对象,列表或字典?换句话说,除了将结果存储在SQL中之外,是否有办法访问先前对此类服务的调用结果 数据库? 请提供参考或解释。
答案 0 :(得分:0)
是的,可以(但不仅仅是)会话。有关更多详细信息,请参阅this CodeProject article的解释很长。请注意,它们与ASP.NET会话不同,它们对于链接多个调用(例如管理事务)非常有用,但它可以很容易地用于存储数据。 / p>
这里只是一个非常简短的介绍作为快速参考。要在WCF中配置会话,您应设置以下三个元素:Binding
,SessionMode
和InstanceContextMode
。
并非所有协议都允许各种会话,例如:
<endpoint address="a" binding="wsHttpBinding"
contract="WcfTest.IService" name="b"/>
使用SessionMode
:
[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface IService {
}
使用InstanceContextMode
实施您的实施:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class Serviceclass : IService {
}
您现在拥有的是每个客户端连接的特定服务实例。当然,存在缺点和缺点。我首先想到的是:
当然还有其他选择。只是一个快速列表:
关于静态字段的说明:它们位于ApplicationDomain
,因此它们在所有实例中共享(InstanceContextMode
不是PerSession
时)。它可以作为缓存(例如使用原始字典)但您必须管理对象生存期(当服务器或主机进程重新启动时,静态成员将被销毁)。要使用它们,您不应该使用会话,您也必须管理同步(因为每个请求可能在不同的线程中提供,因此将同时访问静态字段)。如果负载平衡不是您的问题,那么您可以考虑使用静态共享MemoryCache
(它的线程安全,但您仍然需要自己管理对象的生命周期)。