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