项目中用到了WCF调用,非常频繁,性能优化的时候,考虑到重用通道.重用通道的过程中发现通道由于某种原因挂掉后不能被继续重用,此时就需要创建一个新的通道来用,现在碰到的问题是:
如何检测一个wcf通道是否已经挂掉了?
1 static ITest channel; 2 static object channelLock = new object(); 3 4 public static ITest GetChannel() 5 { 6 if (channel != null && ((ICommunicationObject)channel).State == CommunicationState.Opened) 7 { 8 try 9 { 10 // ((ICommunicationObject)channel).Open(); 11 return channel; 12 } 13 catch (CommunicationException ex) 14 { 15 ((ICommunicationObject)channel).Abort(); 16 channel = null; 17 } 18 return GetChannel(); 19 } 20 else 21 { 22 NetTcpBinding binding = new NetTcpBinding(SecurityMode.None); 23 EndpointAddress address = new EndpointAddress("net.tcp://localhost:1234/TestService"); 24 ITest localTest = DuplexChannelFactory<ITest>.CreateChannel(binding, address); 25 ((ICommunicationObject)localTest).Open(); 26 channel = localTest; 27 return channel; 28 } 29 }
发现这种方式下,之前open过的通道遇到超时问题的时候,并不会自动转换为fault状态,必须要有一次方法调用才能转换为fault状态,也就是说超时后,只有调用一次 channel.DoSomeThing();之后才会触发转换为fault状态,而DoSomeThing方法已经是业务逻辑代码了,是不能够失败的.
到底如何检测wcf通道是不是挂掉了?
如何更好的提高wcf客户端并发调用的性能?