2

也许我不正确地实现 WCF,但是NetNamedPipedBindings在进行多次调用后,我似乎在使用时遇到了 WCF 异常。

这是我正在做的事情的高水平。基本上,我正在处理一个 out of proc exe 并使用 WCF 命名管道来回通信。我通过这个属性让我的主机保持打开状态:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)]

然后,在我的客户端中,我创建了一个static DuplexChannelFactory实例化一次,然后根据需要通过以下方式使用:

channelFactory.CreateChannel().MakeCall();

我添加了一个 Ping 方法只是为了确保主机正常工作(因为主机会发回我们不想在不知道的情况下错过的事件)。此 Ping 方法每 5 秒运行一次,并且只返回一个 true。但是,在运行了几分钟后,我得到了一个TimeoutException. 这是我的异常跟踪:

服务器堆栈跟踪:在 System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout) 在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 在 System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 在 System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) 在 System.ServiceModel.Channels。 ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade) at System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins , Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) at System.ServiceModel.Channels.ServiceChannelProxy。InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

我打开了 JustDecompile,发现这个错误很可能发生在这里:

connection = this.connectionPoolHelper.EstablishConnection(timeout)

但是,我看不出为什么在之前工作了几次 ping 之后这会超时?我需要设置什么设置才能使这个无限和/或我是否有另一种方法可以从客户端或服务器端实现这个 WCF 事件服务器(它也用于按需处理)?

更新

在我开始看到呼叫尝试并且没有返回之前,我做了大约 6 次 ping。

4

2 回答 2

2

问题是你不能CreateChannel一遍又一遍地调用它。没有 dispose 方法,因为这只是我的 WCF 接口的代理。所以,我只是通过存储对代理的引用并在需要重新实例化主机时重新创建它来解决这个问题。

你会认为会有一些关于这个的文档。当有博客写在他们确实多次调用 CreateChannel 的地方时,它尤其没有帮助。

更新:

这是我发现的应该如何解决这个问题......虽然它对我不起作用......但对其他人来说似乎

在链接失效的情况下截断代码:

您必须使用转换为 IClientChannel 的 using,然后在 using 中重置您的引用。该通道将正常关闭,但您的参考将保持打开状态。注意演员表

using (IClientChannel client = (IClientChannel)channelFactory.CreateChannel())
{
    var proxy = (IMyInterface)client;
}
于 2012-05-02T21:23:12.810 回答
0

您应该使用sysinternals 中的PipeList来查看是否继续不必要地创建新管道。它们将显示为 GUID。有关WCF 命名管道命名约定的进一步参考,请参阅MSDN 博客。

于 2012-05-02T20:40:17.163 回答