Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 套接字与WCF_.net_Wcf_Sockets - Fatal编程技术网

.net 套接字与WCF

.net 套接字与WCF,.net,wcf,sockets,.net,Wcf,Sockets,我在一个类似聊天的应用程序上工作,在客户端使用Silverlight,在服务器端使用wpf。现在的通信是基于套接字的:我有不同的消息类,通过TCP序列化和发送 我开始意识到,为每个可能的通信场景创建一个分离的消息类是一个很大的开销,并考虑移动到WCF。 因此,我需要知道以下几点: 似乎使用WCF的整个通信都是基于客户端调用我的WCF服务中公开的方法。有没有办法知道哪个客户机调用某个方法?这对我的申请很重要 当客户端与服务器断开连接(例如关闭Silverlight客户端运行的浏览器窗口)时,WCF

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

<>我开始意识到,为每个可能的通信场景创建一个分离的消息类是一个很大的开销,并考虑移动到WCF。 因此,我需要知道以下几点:

  • 似乎使用WCF的整个通信都是基于客户端调用我的WCF服务中公开的方法。有没有办法知道哪个客户机调用某个方法?这对我的申请很重要

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

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

  • 每个客户端连接都有自己的线程吗?如果客户端每2秒调用一次方法,服务器(在一台功率合理的PC上运行)可以同时处理多少个连接?我只需要一个估计(10、100、1000甚至更多)。“更多”就好了;)

  • 也许我完全错了,WCF根本无法基于连接工作。然后,我必须找到一种解决方法,以便仍然管理活动连接列表

    谢谢你的帮助!
    Andrej

    对于3,我知道您可以调用async

    对于4是的,他们有自己的线程。WCF是相当“大”和复杂的,你应该买一本书来更好地理解它。

    我的答案:

  • 对。所有通信都基于调用方法
  • 一般来说,没有
  • 您可以同步或异步调用方法。这是你的选择
  • 更多。一是案例权利制度设计
  • 由于您使用的是Silverlight应用程序,因此可以在消息层上实现UserNamePassword验证器,该验证器向soap消息添加一些头,这可以用于唯一标识客户端,除非客户端是匿名的。然后,当需要访问wcf服务中其他位置的用户名时,可以使用System.ServiceModel.OperationContext.Current

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

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

  • 在silverlight 3中实现二进制消息编码,为了最大限度地利用ur服务器及其带宽,silverlight不支持原始tcp连接,出于非常好的原因,必须在http消息中对其进行敲打。每个客户机可以有许多并发调用(异步记住),因此为了保持简单,只需将其视为服务器为每个消息调用分配一个单独的线程。为了回答你刚才所说的问题,1000


  • 我没有确切的答案给你,所以我会在评论中留下这个。我强烈建议你买一本Juval Lowy的“编程WCF服务第二版”。他的书应该能回答你所有的问题。简短回答:您当然可以使用WCF处理所有场景。在我提到的书中可以找到how's。更多参考资料:感谢您的详细回答:)最后一个问题:我当前的方法(使用套接字)在性能方面是否远远优于WCF?如果你说,WCF可以同时处理1000个连接,那么套接字大约可以处理多少客户端?2000、5000甚至10000?我希望每个客户端每1到5秒发送一条消息。就像这样,每个连接的客户端都有一个会话id,每个发送的消息都有一个唯一的id,因此理论上,您应该能够发送尽可能多的同步消息,服务器可以反序列化、工作,然后序列化响应(带宽限制为)。使用tcp套接字意味着通过http上的二进制编码进行序列化的内容要少得多,因为没有http,去掉了应用层的中间人,并在代码中创建了自己的leightweigth层。这意味着反序列化工作和序列化工作更少,因此您可以更快地响应更多消息