也许我正在不正确地实现WCF,但在进行大量调用之后,我似乎在使用NetNamedPipedBindings
时遇到了WCF异常。
这是我正在做的高水平。基本上,我正在使用proc exe并使用WCF命名管道进行来回通信。我通过以下属性打开主机:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
然后,在我的客户端,我创建一个static DuplexChannelFactory
,我实例化一次,然后根据需要使用:
channelFactory.CreateChannel().MakeCall();
我添加了一个Ping方法只是为了确保主机正常工作(因为主机会发回我们不想错过的事件而不知道)。此Ping方法每5秒运行一次,只返回true。但是,运行几分钟后,我得到TimeoutException
。这是我的异常追踪:
服务器堆栈跟踪:at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(时间跨度 超时)at System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan 超时)at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel 频道,TimeSpan超时)at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(时间跨度 超时,CallOnceManager级联)at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(时间跨度 System.ServiceModel.Channels.ServiceChannel.Call(String。) action,Boolean oneway,ProxyOperationRuntime操作,Object [] ins, 对象[]出局,TimeSpan超时)at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway,ProxyOperationRuntime操作,Object [] ins, 对象[]出局) System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime operation)at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天 消息)
我打开了JustDecompile,看到这个错误最有可能发生在这里:
connection = this.connectionPoolHelper.EstablishConnection(timeout)
然而,我没有看到任何理由为什么在之前的几次ping工作之后这会超时?我需要设置什么设置才能使其无限和/或是否有另一种方式让我从客户端或服务器端实现此WCF事件服务器(它也用于按需处理)?
更新
在我开始看到呼叫尝试并且没有返回之前,我做了大约6次ping。
答案 0 :(得分:2)
问题在于,您无法一遍又一遍地呼叫CreateChannel
。没有dispose方法,因为这只是我的WCF接口的代理。所以,我刚刚通过存储对代理的引用并在主机需要重新实例化时重新创建它来解决这个问题。
您会认为会有关于此的某种文档。当有博客写入多次调用CreateChannel时,它尤其无济于事。
更新:
在链接死亡时剪切代码:
您必须使用对IClientChannel进行强制转换的使用,然后在使用中重置您的引用。频道将正常关闭,但您的参考将保持打开状态。注意演员表
using (IClientChannel client = (IClientChannel)channelFactory.CreateChannel())
{
var proxy = (IMyInterface)client;
}
答案 1 :(得分:0)
您应该使用sysinternals中的PipeList来查看是否继续不必要地创建新管道。它们将显示为GUID。请参阅MSDN blogs for further reference on WCF named pipe naming conventions。