如何存储WCF会话,以便其他应用程序可以访问它们

时间:2009-09-07 11:13:35

标签: c# wcf session

嗨,我有一个像这样的操作的应用程序..

Client <----> Server <----> Monitor Web Site

WCF用于通信,每个客户端在服务器上都有自己的会话。这样就可以从服务器回调到客户端回调。

目标是“监控网站”上的用户可以执行以下操作:

a)查看当前在线的所有用户 - 即使用客户端应用程序。

b)选择客户端,然后在客户端上执行操作。

这是一个培训系统,因此使用Web终端的教师可以选择他或她的目标客户端,然后让客户端应用程序执行某些操作。或者他们可能希望向客户端发送一条消息,该消息将显示在客户端屏幕上。

我似乎无法做的是在服务器应用程序中存储所有客户端的列表,然后由服务器检索。如果我可以这样做,那么我可以访问客户端的回调对象并调用适当的方法。

监控网站上的方法看起来像这样......

Service.SendMessage(userhashcode, message)

然后服务会以某种方式查找与哈希码匹配的回调,然后执行类似这样的操作

callback.SendMessage(message)

到目前为止,我一直试着将回调序列化为集中式数据库。但是,在服务上似乎不可能将远程对象序列化,因为客户端存在回调。

此外,我认为我可以在我的服务中创建一个全局哈希表,但我不确定如何执行此操作并使其可以在应用程序范围内访问。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

通常,WCF服务仅“按呼叫”,例如每个调用者获取服务类的新实例,它处理请求,格式化响应,发送回来然后被处置。通常情况下,你在内存中没有任何“会话式”的东西。

您所拥有的不是服务类本身,而是服务主机 - 充当服务类主机的类。这是IIS(在这种情况下,您只需要监视IIS),或者它是一个自定义应用程序(Windows NT服务,控制台应用程序),它已启动并运行ServiceHost实例。

我不知道可能有什么样的钩子可以连接到服务主机并“查看”服务主机 - 但这就是你真正想要的,我猜。

WCF服务也可以配置为session-ful,并保持会话启动并与服务类一起运行 - 但同样:您需要明确启用它。即便如此,我还不确定你是否有很多API钩子可以“进入”服务主机,并查看当前的sesssions。

问题是:你真的需要吗? WCF暴露了大量的性能计数器,因此您可以监视和记录WCF中发生的任何 - 这对您来说不够好吗?

目前,WCF服务并非真正托管在一个设计得特别好的系统中 - 所谓的“Dublin”服务器插件应该会变得更好,该服务器插件用于托管WCF服务和WF工作流程并为管理员提供监控和管理它们的绝佳体验。 “都柏林”计划在.NET 4.0推出后不久推出(微软承诺将在2009日历年结束前推出)。

马克

答案 1 :(得分:0)

我所做的如下......

  1. 在我的服务中创建了一个静态实例,用于保存每个WCF连接的哈希码键入的回调字典。

  2. 创建会话时,它会将自己发布到包含哈希码和其他连接信息的数据库表。

  3. 当用户使用监控Web应用程序时,它可以从数据库中获取已连接客户端的列表,并获取该客户端的哈希码。

  4. 如果监控应用程序用户想要向客户端发送命令,则会发生以下情况。

    • sessionn的哈希码是从db获得的。
    • 在服务上调用一个方法,例如SendTextMessage(int hashcode,string message)。
    • 此方法现在从回调字典中查找客户端的回调并获取对它的引用。
    • 在这种情况下,适当的方法是在回调上调用SendTextMessage(message)。
  5. 我测试了这个并且它工作正常,我还添加了一个功能,以保持数据库表与实际的WCF会话同步并根据需要进行清理。