我在类似聊天的应用程序上工作,我在客户端使用Silverlight,在服务器端使用wpf。现在通信基于套接字:我有不同的消息类,我通过TCP序列化和发送。
我开始意识到为每个可能的通信场景创建一个单独的Message Class是一个很大的开销,并考虑转移到WCF。
因此我需要了解以下事项:
似乎使用WCF的整个通信基于我的WCF服务中的客户端callind公开的方法。有没有办法知道哪个客户端调用某种方法?这对我的申请非常重要。
当客户端从服务器断开连接(例如关闭运行Silverlight客户端的浏览器窗口)时,WCF是否通知我的应用程序?这也非常重要。
方法调用是完全异步的吗?如果是这样,我是否必须将每个方法调用重新路由到服务器应用程序的主线程?
每个客户端连接都有自己的线程吗?如果客户端调用方法说每2秒,服务器(在合理供电的PC上运行)可以处理多少个同时连接?我只需要一个估计(10,100,1000甚至更多)。 “更多”会很棒;)
也许我完全错了,WCF完全没有基于连接的工作。然后我必须找到一个解决方法来仍然管理活动连接列表。
感谢您的帮助! 安德烈
答案 0 :(得分:4)
由于您使用的是Silverlight应用程序,因此您可以在消息层上实现UserNamePassword Validator,它会向soap消息添加一些标头,这可用于唯一标识客户端,除非客户端是匿名的。然后,当您需要访问wcf服务中其他位置的用户名时,可以使用System.ServiceModel.OperationContext.Current。
当客户端断开连接时,服务器不会得到通知,因为默认情况下msgs是“PerCall”,有一种方法,使用Singleton类作为你的ServiceContract和InstanceContextMode.Single,然后使用回调服务实现OperationContract ,然后当客户端登录到你的服务时,他们必须注册回调服务,你的回调服务然后可以循环通过连接的客户端并检查回调的状态,无论它是否仍然打开,最后删除连接关闭的条目,最终您可以获得所需的功能。
异步调用来自客户端,即。在Silverlight中,所有webservice调用都是异步的,就像在ASP中你可以选择一样,WCF自动处理异步功能,所以你不需要重新路由任何东西,只需将ServiceContract编码为单个线程,一切都会好的
在silverlight 3中实现二进制消息编码,为了充分利用你的服务器及其带宽,silverlight不支持原始tcp连接,它必须在http消息中敲击,原因很充分。每个客户端都可以有多个并发调用(异步记忆),所以为了简单起见,只需将其视为服务器为每个消息调用分配一个单独的线程。所以回答你刚才所说的问题,1000。
答案 1 :(得分:0)
3我知道你可以打电话给异步。
对于4是的,他们有自己的主题。 WCF非常“大”且复杂,你应该拿一本书来更好地理解它。
答案 2 :(得分:0)
我的回答: