嗨,我有一个像这样的操作的应用程序..
Client <----> Server <----> Monitor Web Site
WCF用于通信,每个客户端在服务器上都有自己的会话。这样就可以从服务器回调到客户端回调。
目标是“监控网站”上的用户可以执行以下操作:
a)查看当前在线的所有用户 - 即使用客户端应用程序。
b)选择客户端,然后在客户端上执行操作。
这是一个培训系统,因此使用Web终端的教师可以选择他或她的目标客户端,然后让客户端应用程序执行某些操作。或者他们可能希望向客户端发送一条消息,该消息将显示在客户端屏幕上。
我似乎无法做的是在服务器应用程序中存储所有客户端的列表,然后由服务器检索。如果我可以这样做,那么我可以访问客户端的回调对象并调用适当的方法。
监控网站上的方法看起来像这样......
Service.SendMessage(userhashcode, message)
然后服务会以某种方式查找与哈希码匹配的回调,然后执行类似这样的操作
callback.SendMessage(message)
到目前为止,我一直试着将回调序列化为集中式数据库。但是,在服务上似乎不可能将远程对象序列化,因为客户端存在回调。
此外,我认为我可以在我的服务中创建一个全局哈希表,但我不确定如何执行此操作并使其可以在应用程序范围内访问。
任何帮助都将不胜感激。
答案 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)
我所做的如下......
在我的服务中创建了一个静态实例,用于保存每个WCF连接的哈希码键入的回调字典。
创建会话时,它会将自己发布到包含哈希码和其他连接信息的数据库表。
当用户使用监控Web应用程序时,它可以从数据库中获取已连接客户端的列表,并获取该客户端的哈希码。
如果监控应用程序用户想要向客户端发送命令,则会发生以下情况。
我测试了这个并且它工作正常,我还添加了一个功能,以保持数据库表与实际的WCF会话同步并根据需要进行清理。