在WCF服务之间共享会话

时间:2008-11-11 14:17:22

标签: wcf

我一直致力于拆分Web应用程序的应用层和Web层。在应用层中,我设法将业务逻辑分离为使用WCF代理公开的一堆服务。问题是这些服务与另一个使用大型CLR对象作为其主要通信方式的遗留应用程序进行通信。为了保持快速,我在第一次创建对象后,一直在会话中保留此对象的副本。现在我知道WCF可以进行会话,但是会话存储是按服务进行的,而我的业务逻辑现在被分成多个服务(应该是这样)。

现在问题:

  1. 有没有办法在同一主机上托管的WCF服务之间共享会话存储?
  2. 这是我应该做的事吗?
  3. 如果没有,那么这里的最佳做法是什么?
  4. 这可能不是第一次有人在服务器上拥有大型业务对象。不幸的是,我确实需要为每个用户缓存此对象(因此会话)。

    答案显而易见,我只是没有看到它。求救!

6 个答案:

答案 0 :(得分:3)

我认为实例上下文共享可以提供帮助

http://msdn.microsoft.com/en-us/library/aa354514.aspx

答案 1 :(得分:1)

据我了解WCF,它被设计成尽可能无状态。在会话中,您可以记住服务中的某些值,但对象不应超出会话范围。

因此,我认为你遇到了麻烦。

当然,可能有一些方法可以在我不认识的会话之间存储和交换对象(我使用WCF,但除了我自己需要的东西之外,我不太了解它。)< / p>

(如果有一种方法可以在服务之间共享对象,它可能只适用于您自己托管的服务.IIS主机有时可能会回收您的服务)

答案 2 :(得分:1)

也许您可以将此对象包装在单件服务中。这是一个只有一个实例的服务,不会在调用之间销毁。由于每个用户都需要一个对象,因此该服务必须管理它们的列表,并且调用服务必须提供所需的身份验证数据(或sessionid)。不要忘记超时以摆脱不需要的对象......

答案 3 :(得分:1)

创建一个facade service,代表其他应用层服务托管大型CLR对象。它可以作为adapter使用,允许更具体的会话标识符到您创建的更高级的应用层服务。 Facade可以提供会话标识符,例如GUID,您的应用层服务可以使用它来与大型CLR对象重新连接。

这提供了一些优势:

  1. 您的某些应用层可能根本不需要了解CLR对象。他们只与远程门面沟通。

  2. '大型CLR对象'主机代表现在可以共享的其他服务保留会话对象。

  3. 应用程序层现在有一个外观,通过它可以与旧服务进行通信。在您重构此旧服务时,应用层不必更改。

  4. 根据您的设置,您可以通过proc主机托管外观,这将为您提供保留性能提升。

答案 4 :(得分:0)

如果您希望能够将应用程序扩展到服务器场,那么将内容分解为子服务似乎是一个好主意。但是,重要的是要记住,每当一个对象越过appdomain边界时,它就必须被复制到内存中。

这完全取决于对象的大小以及它所拥有的数据类型。

如果您不想传递该对象,因为它太大,您可能想要为接收它的服务创建查询API。通过这种方式,您可以操作该对象,而无需进行昂贵的序列化或远程处理。

答案 5 :(得分:0)

保持简单。由于您已经可以访问WCF中的Session,因此可以使用SessionID。现在:

  1. 在某处创建一个静态字典,其中Key是您的sessionId,值是您要存储的业务对象。

  2. 不是访问会话中的业务对象,只需访问sessionid并从字典的值中获取业务对象。

  3. (如果您愿意,也可以使用某种类型的缓存,例如System.Web.Caching,这样您就不必手动清理字典了)