套接字与WCF

时间:2009-06-24 19:01:30

标签: .net wcf sockets

我在类似聊天的应用程序上工作,我在客户端使用Silverlight,在服务器端使用wpf。现在通信基于套接字:我有不同的消息类,我通过TCP序列化和发送。

我开始意识到为每个可能的通信场景创建一个单独的Message Class是一个很大的开销,并考虑转移到WCF。

因此我需要了解以下事项:

  1. 似乎使用WCF的整个通信基于我的WCF服务中的客户端callind公开的方法。有没有办法知道哪个客户端调用某种方法?这对我的申请非常重要。

  2. 当客户端从服务器断开连接(例如关闭运行Silverlight客户端的浏览器窗口)时,WCF是否通知我的应用程序?这也非常重要。

  3. 方法调用是完全异步的吗?如果是这样,我是否必须将每个方法调用重新路由到服务器应用程序的主线程?

  4. 每个客户端连接都有自己的线程吗?如果客户端调用方法说每2秒,服务器(在合理供电的PC上运行)可以处理多少个同时连接?我只需要一个估计(10,100,1000甚至更多)。 “更多”会很棒;)

  5. 也许我完全错了,WCF完全没有基于连接的工作。然后我必须找到一个解决方法来仍然管理活动连接列表。

    感谢您的帮助! 安德烈

3 个答案:

答案 0 :(得分:4)

  1. 由于您使用的是Silverlight应用程序,因此您可以在消息层上实现UserNamePassword Validator,它会向soap消息添加一些标头,这可用于唯一标识客户端,除非客户端是匿名的。然后,当您需要访问wcf服务中其他位置的用户名时,可以使用System.ServiceModel.OperationContext.Current。

  2. 当客户端断开连接时,服务器不会得到通知,因为默认情况下msgs是“PerCall”,有一种方法,使用Singleton类作为你的ServiceContract和InstanceContextMode.Single,然后使用回调服务实现OperationContract ,然后当客户端登录到你的服务时,他们必须注册回调服务,你的回调服务然后可以循环通过连接的客户端并检查回调的状态,无论它是否仍然打开,最后删除连接关闭的条目,最终您可以获得所需的功能。

  3. 异步调用来自客户端,即。在Silverlight中,所有webservice调用都是异步的,就像在ASP中你可以选择一样,WCF自动处理异步功能,所以你不需要重新路由任何东西,只需将ServiceContract编码为单个线程,一切都会好的

  4. 在silverlight 3中实现二进制消息编码,为了充分利用你的服务器及其带宽,silverlight不支持原始tcp连接,它必须在http消息中敲击,原因很充分。每个客户端都可以有多个并发调用(异步记忆),所以为了简单起见,只需将其视为服务器为每个消息调用分配一个单独的线程。所以回答你刚才所说的问题,1000。

答案 1 :(得分:0)

3我知道你可以打电话给异步。

对于4是的,他们有自己的主题。 WCF非常“大”且复杂,你应该拿一本书来更好地理解它。

答案 2 :(得分:0)

我的回答:

  1. 是。所有通信都基于呼叫方法。
  2. 一般而言 - 否。
  3. 您可以同步或异步调用方法。这是你的选择。
  4. 更多。我是正确的系统设计案例。