gpt4 book ai didi

c# - 多次调用后 WCF 中的 TimeoutException

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:44 24 4
gpt4 key购买 nike

也许我未正确实现 WCF,但在多次调用后使用 NetNamedPipedBindings 时似乎出现了 WCF 异常。

这是我正在做的事情的高层次。基本上,我正在处理进程外的 exe 并使用 WCF 命名管道来回通信。我通过此属性让我的主机保持打开状态:

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

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

channelFactory.CreateChannel().MakeCall();

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

Server stack trace: at System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout) at 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。

最佳答案

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

您可能会认为会有一些关于此的文档。当有博客多次调用 CreateChannel 时,这尤其无济于事。

更新:

Here is what I found as to how this should be solved...although it did not work for me.., but seems to for others

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

您必须使用强制转换为 IClientChannel 的 using,然后在 using 中重置您的引用。该 channel 将正常关闭,但您的引用将保持打开状态。注意类型转换

using (IClientChannel client = (IClientChannel)channelFactory.CreateChannel())
{
var proxy = (IMyInterface)client;
}

关于c# - 多次调用后 WCF 中的 TimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10420973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com