none
我有些Wcf的问题想问一下请给点帮助!! RRS feed

  • 问题

  • 使用Windows服务来作为宿主程序,Wcf 绑定net.tcp

    服务器端有客户端上下文管理的程序 主要管理一个shared list(of ClientInfo) 静态的客户登录列表,其中clientinfo有客户登录时间,客户的上次活动时间 ,客户最后活动时间,如果发现客户最后活动时间和上次活动时间超过1分钟就表示客户已经掉线或死机什么的.

    这个程序运行在Wcf宿主的WindowServices上的system.timer中 而客户端每隔30秒调用服务器的方法表示自己正常(也运行在客户端的system.timer中)

    不知道这种方式是否合适?还是Wcf本身的会话就能实现我需要的功能!我所需要的功能就是能知道客户端连接到服务器端(永久性连接不是请求结束就关闭的那种如果是请求完就关闭我就选WebSerive了说白了也就类似于聊天室那种工作模式)是否正常,如果发现错误死机,掉线,结束任务等异常可以将客户端的上下文信息清除出list(of clientInfo)。

    有无更好的方式!

    如果客户端永久连接到服务端对服务端有多大的影响,可能有500个客户连接吧.

    如果有客户掉线,服务器端将其上下文实例清楚后还需要做什么,这个客户的连接资源如何释放还是Wcf自动释放?

     

    2010年4月25日 12:52

答案

  • 刚刚我们已经测试完客户端连接一个Wcf服务器端,而这个Wcf服务器端作为客户端连接另一台机器的Wcf服务器端,另台机器的Wcf服务器端作为客户端连接再另一台机器的服务器端,而这个Wcf 连接数据库服务器!测试已经成功,最终客户端可以通过这些Wcf的服务程序得到正确的数据,现在就剩上面提到的问题啦!版主帮忙!!


    Hi,

        关于你的问题,我确认了一下。Mog说的也有道理,对象肯定会回收。只是时机问题。我找了一个文章。

    这个文章说,如果会话结束,服务实现了IDisposable,就会调用Dispose 方法。

    The session typically terminates when the client closes the proxy, which notifies the service that the session has ended. If the service supports IDisposable, then the Dispose method will be called.

    这里说,如果客户端关闭代理或者通信处问题,每个会话都会有一个空闲等待时间timeout ,默认是10分钟。如果十分钟客户端还没任何动作。会话会自动结束。一旦会话结束,服务实例也会被回收的。

    Typically, the session will end once the client closes the proxy. However, in case the client fails to terminate gracefully or encounters a communication problem, each session also has an idle time timeout that defaults to 10 minutes—the session will automatically terminate after 10 minutes of inactivity from the client, even if the client still intends to use the session. Once the session has terminated due to the idle timeout, if the client tries to use its proxy, the client will get a communicationObjectFaultedException.
       我感觉这个说法还是比较可靠的。服务实例不会立即被销毁。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 HaHaWcf 2010年4月29日 4:32
    2010年4月27日 11:40
    版主
  • 当TcpTransport网络故障时,有两种情况致使服务端的channel进入fault状态然后abort:一种是服务端的ReceiveTimeout,如frank所说,默认10分钟;另一种是InactivityTimeout,当启用ReliableSession时,此参数有用。

    我用PerformanceCounter检测以上两种情况以及正常关闭客户端,当服务端Channel abort或close时,service instance 同时析构。


    Mog Liang
    • 已标记为答案 HaHaWcf 2010年4月29日 4:32
    2010年4月28日 1:26
  • 标记一下答案就是结贴啊
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 HaHaWcf 2010年4月29日 4:31
    2010年4月28日 10:07
    版主

全部回复

  • 补充一点,通过list(of clientInfo)来对所有客户端进行回调!
    2010年4月25日 12:57
  • 关注

    2010年4月26日 1:45
  • 我现在找到一个方式可以直接将客户端的Channel关闭!不知道这样是否正确,经测试,通信通道和客户上下文都可以清除,有问题吗?是不是客户端Channel关闭会话也随之关闭,服务器资源也会释放?

    在不关闭客户端Channel之前,服务器依旧可以向掉线的客户端回调不过客户端无法接收到直到达到超时设置客户端的Channel自动关闭.在我的机器上我打开防火墙观察到,客户掉线防火墙也依旧显示可以向这个客户端发送数据,只是接收数据不变,如果达到超时时间的话防火墙才显示这个客户端已经没有啦!而现在我找到的方法可以在服务器端主动关闭客户端Channel而防火墙立刻也显示此客户端消失!而这一切都与Wcf服务器端的超时设置无关

    请问这样对否?是否有什么后遗症??谢谢!

    另外版主呢?快来救人啊

    2010年4月26日 9:45
  • net.tcp应该只是会话的,启用会话模式以后,但从服务端来考虑,如果关闭客户端Channel,应该是释放了通道资源。但是服务实例未必销毁。

    另外你测试的客户端和服务端在一个机器上?

    客户端掉线,服务端对应的客户端通道等是否立即销毁。

      


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年4月26日 12:43
    版主
  • 您说的很对,我就是担心服务实例不能销毁,是否能销毁掉线客户端的实例我的确不知道,还望指点!!不过通道和客户端的上下文我都可以正常关闭!

    我的客户端和服务端不在同一台机器上,昨晚和同事测试,分别从3台机器登陆到服务端,每个机器开40个客户端程序发送消息,服务器端能正常工作,然后我们将一台机器的网线拔掉,服务器端在我们设置的时间内(10秒)自动关闭了这台机器上的40个通道和这40个客户的上下文连接(这个超时是我们自己做的程序与wcf的超时设置无关)现在问题就是如您说的一样,这40个在服务器端的实例能否被销毁,如果不能,我怎样可以使用程序来销毁它们!!

    昨晚的测试很是成功,估计服务端机器好点的话,同时加入几百个客户端不成问题!!

    请帮忙解释下我的问题,谢谢!!

     

     

    2010年4月27日 3:26
  • 刚刚我们已经测试完客户端连接一个Wcf服务器端,而这个Wcf服务器端作为客户端连接另一台机器的Wcf服务器端,另台机器的Wcf服务器端作为客户端连接再另一台机器的服务器端,而这个Wcf 连接数据库服务器!测试已经成功,最终客户端可以通过这些Wcf的服务程序得到正确的数据,现在就剩上面提到的问题啦!版主帮忙!!

    2010年4月27日 6:24
  • 你可以用Performance Counter来监视服务端实例的情况。

    http://msdn.microsoft.com/en-us/library/ms735098.aspx

    就我理解,在PerSession模式下,channel close或abort后,对应的service实例也销毁了。另外,WCF 的ReliableSession会每隔半个inactivityTimeout发一个Ack信号来确认通讯两端的状态,你不用自己实现心跳信号。


    Mog Liang
    2010年4月27日 6:34
  • 刚刚我们已经测试完客户端连接一个Wcf服务器端,而这个Wcf服务器端作为客户端连接另一台机器的Wcf服务器端,另台机器的Wcf服务器端作为客户端连接再另一台机器的服务器端,而这个Wcf 连接数据库服务器!测试已经成功,最终客户端可以通过这些Wcf的服务程序得到正确的数据,现在就剩上面提到的问题啦!版主帮忙!!


    Hi,

        关于你的问题,我确认了一下。Mog说的也有道理,对象肯定会回收。只是时机问题。我找了一个文章。

    这个文章说,如果会话结束,服务实现了IDisposable,就会调用Dispose 方法。

    The session typically terminates when the client closes the proxy, which notifies the service that the session has ended. If the service supports IDisposable, then the Dispose method will be called.

    这里说,如果客户端关闭代理或者通信处问题,每个会话都会有一个空闲等待时间timeout ,默认是10分钟。如果十分钟客户端还没任何动作。会话会自动结束。一旦会话结束,服务实例也会被回收的。

    Typically, the session will end once the client closes the proxy. However, in case the client fails to terminate gracefully or encounters a communication problem, each session also has an idle time timeout that defaults to 10 minutes—the session will automatically terminate after 10 minutes of inactivity from the client, even if the client still intends to use the session. Once the session has terminated due to the idle timeout, if the client tries to use its proxy, the client will get a communicationObjectFaultedException.
       我感觉这个说法还是比较可靠的。服务实例不会立即被销毁。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 HaHaWcf 2010年4月29日 4:32
    2010年4月27日 11:40
    版主
  • 感谢两位版主的热心!

    如果Mog版主所说的 如果在PerSession模式下,channel close或abort后,对应的service实例也销毁了 那我的问题就全部解决啦!能确认吗?

    frank版主所介绍的情况我们全部经历啦!客户端代理关闭会话结束服务端释放实例不成问题,就是非法断线,这时如果能在超时(wcf服务的超时设置)之前连上,那么此客户端的上下文还能用吗?服务端依旧能使用原来的上下文进行回调吗?今天没环境测试明天我们试试!那如果上下文不能用的话,那么客户必须重新登录到服务器端并更新自己的上下文,这是对的吧!但是如果客户端就此不上线了,那么这个上下文肯定会留在服务器端一段时间,而服务端在未超时的范围内会使用这个掉线客户单的上下文进行回调,如果超时范围时间长,必定出错,我们所作的就是将此上下文给销毁掉,并切销毁这个客户的通信通道(channel.abort,channel.close).

    两位所提供的资源我仔细阅读了!我们使用Wcf服务端的一个静态变量记录所有登录的客户端信息,包括上下文和OperationContext.Current.Channel 这样是为了服务端回调所有用户的信息(就像聊天室中的向全部人员发话一样),而服务器宿主可以使用此静态变量的信息中的OperationContext.Current.Channel将客户端终止掉(这里是关键,终止通道,实例终止销毁吗?)

    我们没有使用perfmon.exe来监视wcf服务,只使用了原始的金山网镖的表现来测试的情况如下:

    wcf的第一个版本:不将Channel 关闭 使用Wcf超时设置

                            客户端拔掉网线,其他客户向这个客户发送消息,金山网镖依旧显示可以向这个掉线客户发送消息字节数不断增长,但是接收数据为不变,大约过了1分钟 

                            也就是达到了Wcf默认超时设置,防火墙中这个掉线客户的显示就没有了,那就说明此客户与Wcf的通道关闭了,当然因为是Wcf机制关闭的所以我们认为服务器端这个

                            客 户的实例已经销毁啦!

    wcf的第二个版本:使用我们自己的心跳检测器,为了测试1秒种检测掉线 Wcf端超时还是默认的1分钟

                           当客户端拔掉网线,检测程序在1秒钟后立刻将此客户端的Channel关闭,在检测其中执行Channel.abort ;channel.close 那么防火墙立刻显示这个掉线客户就消失.那就说明

                           我们的检测器成功关闭了此客户与Wcf的通道,可是这个时候我们就不能确定,这个客户端连接的服务实例是否被销毁啦!

    frank 感谢你提供的文章很有研究啊!

    希望得到明确的答复!

     

     

    如果在PerSession模式下 我们在Wcf 服务端 channel close或abort后,service实例的确也销毁了吗?

    • 已编辑 HaHaWcf 2010年4月27日 12:58 改错
    2010年4月27日 12:57
  • 当TcpTransport网络故障时,有两种情况致使服务端的channel进入fault状态然后abort:一种是服务端的ReceiveTimeout,如frank所说,默认10分钟;另一种是InactivityTimeout,当启用ReliableSession时,此参数有用。

    我用PerformanceCounter检测以上两种情况以及正常关闭客户端,当服务端Channel abort或close时,service instance 同时析构。


    Mog Liang
    • 已标记为答案 HaHaWcf 2010年4月29日 4:32
    2010年4月28日 1:26
  • 当服务端Channel abort或close时,service instance 同时析构。

    感谢两位版主的热心,既然当服务器端Channel abort或close,service instance同时析构,那就意味着已经标记为可以释放销毁.就没有什么可担心的啦(担心的原因就是怕资源不释放,天天启动服务器哈哈!)

    这里有没有结贴!?

    2010年4月28日 4:41
  • 标记一下答案就是结贴啊
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    • 已标记为答案 HaHaWcf 2010年4月29日 4:31
    2010年4月28日 10:07
    版主