可以分配持久对象吗?

时间:2014-01-20 10:27:20

标签: .net web-services

是否可以在.NET WCF服务的上下文中分配持久对象,列表或字典?换句话说,除了将结果存储在SQL中之外,是否有办法访问先前对此类服务的调用结果 数据库? 请提供参考或解释。

1 个答案:

答案 0 :(得分:0)

是的,可以(但不仅仅是)会话。有关更多详细信息,请参阅this CodeProject article的解释很长。请注意,它们与ASP.NET会话不同,它们对于链接多个调用(例如管理事务)非常有用,但它可以很容易地用于存储数据。 / p>

这里只是一个非常简短的介绍作为快速参考。要在WCF中配置会话,您应设置以下三个元素:BindingSessionModeInstanceContextMode

并非所有协议都允许各种会话,例如:

<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 {
}

您现在拥有的是每个客户端连接的特定服务实例。当然,存在缺点和缺点。我首先想到的是:

  • 服务器上的内存使用量将增加(不仅是内存,而且通常是许多资源),因为状态保留在内存中,并且必须跟踪会话。
  • 负载平衡将更加困难(因为您必须跟踪会话),并且您可以完成使用第7层l.b.不要因为会话而使你的应用程序过于复杂。相比之下,基于数据库的解决方案也可以在第4层负载平衡上很好地扩展。

当然还有其他选择。只是一个快速列表:

  • 您认为可以将会话数据存储在数据库中。
  • 您可以将会话数据存储在您发送给客户端的令牌中,然后回复每次通话。当客户端协商连接时,您向他发送一个不透明的令牌(甚至可能是一个简单的字典),并且必须将其发送回每个请求(作为每个合同方法的参数)。
  • 您可以构建会话数据存储库,这是一种跟踪会话数据的辅助WCF服务。此服务无法很好地扩展负载平衡,但您的服务将。您可以使用简单的MemoryCache对象将数据存储在其中。
  • 您可以设置ASP.NET样式缓存。主题很长,所以请在这里参考t his nice post

关于静态字段的说明:它们位于ApplicationDomain,因此它们在所有实例中共享(InstanceContextMode不是PerSession时)。它可以作为缓存(例如使用原始字典)但您必须管理对象生存期(当服务器或主机进程重新启动时,静态成员将被销毁)。要使用它们,您不应该使用会话,您也必须管理同步(因为每个请求可能在不同的线程中提供,因此将同时访问静态字段)。如果负载平衡不是您的问题,那么您可以考虑使用静态共享MemoryCache(它的线程安全,但您仍然需要自己管理对象的生命周期)。