none
关于服务端提示“远程终结点已终止该序列 可靠会话出错”的问题 RRS feed

  • 问题

  • 1. WCF 使用 NetTcpBinding绑定,双工通讯。

    2.应用场景:S是服务端,A是数据发送端。

        S端中有一个用户列表,A在建立起与S的连接后,各自的用户信息会存储在该列表中。

        A每50毫秒就调用S端的”发送数据服务“,并将数据存储在S中一个自定义缓存中。同时,通过回调机制,S会将数据发回到用户列表中用户(即A)。

    3. 现在遇到这样一个问题:

        当关闭A时,可能由于A此时还在接收数据。但是在接收的过程中,代理就被关闭了。

        因此,A端会提示:在消息传输完成以前关闭会话。 

                 S端的“发送数据服务”提示:远程终结点已终止该序列。远程终结点可靠会话的用户不再需要有消息和新消息到达。因此,可靠的会话无法继续。 可靠会话出错。

    另:这两篇英文博客我已经看过了,相关代码也加上了。但问题依旧。

    http://www.rcs-solutions.com/blog/2008/09/24/HandlingDisconnectsWithWCF.aspx
    http://www.rcs-solutions.com/blog/2008/07/06/WCFNotificationOnDisconnect.aspx

        请问,有什么好方法解决这个问题?

    2012年3月24日 14:01

答案

  • 谢谢。

    我重新修改了代码,在S端的”发送数据服务“的代码中添加了Current.Channel.Faulted += new EventHandler(Channel_Faulted);也就是说每次A发送数据的时候,都会有个判断机制,告诉S端如果通道出了问题就执行Channel_Faulted代码。

    就目前测试情况看,好像这个问题解决了。

    2012年3月29日 12:57

全部回复

  • 我觉得只要有一端关闭代理,就无法实现吧?

    认真学习,不耻下问.^_^

    2012年3月26日 2:05
  • 在关闭客户端A时,代理就会关闭,连接服务端S到客户端A的通道也会被关闭,可靠会话也会无效,所以S端就会抛出上面的错误信息。你可以试着将binding的receiveTimeout,sendTimeout等timeout的值设置大一些,也将reliablesession的inactivityTimeout值设置大些看看。


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework


    2012年3月26日 3:12
    版主
  • 你的意思是我说这种情况就没办法处理了?

    另:你说的将inactivity timeout值设置大些。

    我是这样理解的: 将其设大了,但是实际上客户端A已经是断掉了,所以这个设不设置大些都没有意义了。因为S在回调将数据传给A时,会发现找不到A,仍旧会报错。

    2012年3月27日 13:22
  • 我的意思你可以试着将NetTcpBinding的receiveTimeout,sendTimeout等timeout的值增大,防止通道过早关闭。如果S端发送到A端的数据量比较大的话,你可以MaxBufferSizeMaxReceivedMessageSize的值设置大些,你可以在服务端与客户端启用WCF Tracing来查看WCF执行情况。 

    #enable WCF tracing.

    http://blogs.msdn.com/b/madhuponduru/archive/2006/05/18/601458.aspx


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework

    2012年3月28日 6:24
    版主
  • 谢谢。

    我重新修改了代码,在S端的”发送数据服务“的代码中添加了Current.Channel.Faulted += new EventHandler(Channel_Faulted);也就是说每次A发送数据的时候,都会有个判断机制,告诉S端如果通道出了问题就执行Channel_Faulted代码。

    就目前测试情况看,好像这个问题解决了。

    2012年3月29日 12:57