插座与。 WCF
Posted
技术标签:
【中文标题】插座与。 WCF【英文标题】:Sockets Vs. WCF 【发布时间】:2009-06-24 19:01:29 【问题描述】:我在一个类似聊天的应用程序上工作,我在客户端使用 Silverlight,在服务器端使用 wpf。现在通信是基于套接字的:我有不同的消息类,我序列化并通过 TCP 发送。
我开始意识到为每个可能的通信场景创建一个单独的消息类是一个相当大的开销,并考虑迁移到 WCF。
因此我需要知道以下几点:
似乎使用 WCF 的整个通信都是基于从我的 WCF 服务调用的客户端公开方法。有没有办法知道哪个客户端调用了某个方法?这对我的应用非常重要。
当客户端与服务器断开连接(例如关闭运行 Silverlight 客户端的浏览器窗口)时,WCF 是否会通知我的应用程序?这也很重要。
方法调用是否完全异步?如果是这样,我是否必须将每个方法调用重新路由到服务器应用程序的主线程?
每个客户端连接都有自己的线程吗?如果客户端调用方法每 2 秒说一次,那么服务器(在功率合理的 PC 上运行)可以同时处理多少个连接?我只需要一个估计(10、100、1000 甚至更多)。 “更多”会很棒;)
也许我完全错了,WCF 根本不能基于连接工作。然后我必须找到一种解决方法来仍然管理活动连接列表。
感谢您的帮助! 安德烈
【问题讨论】:
我没有可靠的答案给你,所以我会在评论中留下这个。我强烈建议您获取 Juval Lowy 的“Programming WCF Services 2nd Edition”的副本。他的书应该回答你所有的问题。简短的回答:您当然可以使用 WCF 处理所有场景。方法可以在我提到的书中找到。 更多参考:***.com/questions/59456579/is-wcf-built-on-sockets 【参考方案1】:由于您使用的是 Silverlight 应用程序,您可以在消息层实现 UserNamePassword Validator,该验证器将一些标头添加到 soap 消息中,这可用于唯一标识客户端,除非客户端是匿名的。那么当您需要在 wcf 服务的其他地方访问用户名时,您可以使用 System.ServiceModel.OperationContext.Current。
客户端断线时不通知服务器,因为msgs默认为“PerCall”,有一种方法,使用一个Singleton类作为你的ServiceContract和InstanceContextMode.Single,然后实现一个带有回调服务的OperationContract ,那么当客户端登录到你的服务时,他们必须向回调服务注册,你的回调服务可以循环访问连接的客户端并检查回调的状态,是否仍然打开,最后删除连接关闭的条目,最终您可以获得所需的功能。
异步调用来自客户端,即。在 Silverlight 中,所有的 web 服务调用都是异步的,就像在 ASP 中你有选择一样,WCF 自动处理异步功能,所以你不需要重新路由任何东西,只需将 ServiceContract 编码为单线程,一切都会好起来的
在 silverlight 3 中实现二进制消息编码,以充分利用您的服务器及其带宽,silverlight 不支持原始 tcp 连接,它必须在 http 消息中进行敲击,这是有充分理由的。每个客户端可以有许多并发调用(异步记住),所以为了简单起见,只要把它想象成服务器为每个消息调用分配一个单独的线程。所以回答你刚才所说的问题,1000。
【讨论】:
感谢您的详细回答 :) 最后一个问题:我当前的方法(使用套接字)在性能方面是否大大优于 WCF?如果你说,WCF 可以同时处理 1000 个连接,那么套接字大约可以处理多少个客户端? 2000、5000 甚至 10.000?我希望每个客户端每 1 到 5 秒发送一条消息。 嗯,就像这样,每个连接的客户端都会获得一个会话ID,并且发送的每条消息都有一个唯一的ID,所以理论上你应该能够同时发送尽可能多的消息服务器可以反序列化,做工作,然后序列化响应(带宽限制)。使用 tcp 套接字意味着通过 http 上的二进制编码序列化的东西要少得多,因为没有 http,切断了作为应用层的中间人,并在你的代码中创建了你自己的 leightweigth 层。所以这意味着更少的反序列化工作和序列化工作,因此您可以更快地响应更多消息【参考方案2】:对于 3 我知道你可以调用 async。
4 是的,他们有自己的线程。 WCF 相当“大”和复杂,你应该买一本书来更好地理解它。
【讨论】:
【参考方案3】:我的答案:
-
是的。所有通信都基于调用方法。
一般 - 没有。
您可以同步或异步调用方法。这是您的选择。
更多。 I 正确系统设计的案例。
【讨论】:
以上是关于插座与。 WCF的主要内容,如果未能解决你的问题,请参考以下文章