WCF中的Binding有四个超时设置的属性从接口IDefaultCommunicationTimeouts实现
但是现在有一个需求,即在两个进程间通信,但需要一个进程A启动另一个进程B,并且发送消息给那个进程B。
首先想到的是使用效率最高的NetNamedPipeBinding来进行通信,
但是当A进程启动B进程,进程B的ServiceHost调用了Open方法,同时A进程发送消息会抛出异常。
可能是由于ServiceHost没有完全打开导致没有侦听端??
于是改用NetTcpBinding进行通信没有出现上述的找不到侦听端的异常,但是当进程B稍微慢了一些的时候(准确的说是超过2秒)会抛出另一个异常。
这个2秒是从哪来的呢??Binding的那几个timeout设置的时长都在1分钟以上啊,反复查找MSDN才找到一处等待的时间间隔和这里基本对应上。
NetTcpBinding类的ReliableSession属性的ReliableSessionBindingElement类的AcknowledgementInterval(但是默认值应该是200ms吧??)
但是不需要修改它的值,只需要设置binding.ReliableSession.Enabled = true;
然后就能等待到差不多50秒的时间,这个时间通过修改NetTcpBinding的SendTimeout来延长或者缩短。
在此抛出几个问题讨论一下:
1、为什么TCP可以在发送消息前能够抛出超时的异常,而Pipe却是直接就找不到侦听端?
2、为什么TCP在没有设置可靠会话时候,不能应用SendTimeout这个值的设置呢?
3、当然如果服务端事先启动好了的话,一切都还是正常的。
本文由 土豆粉培训网转载发布,转载请注明,谢谢