WCF双工nettcp回调不工作



环境

有WCF服务(NET:TCP|Reliable|SecurityEnabled)作为控制台在物理机器A 上运行

有20-30个.NET客户端应用程序(Winforms)通过Citrix公开,因此再次托管在不同于服务器的一台物理机器上。

问题

应用程序结构遵循中讨论的相同模式http://msdn.microsoft.com/en-us/magazine/cc163537.aspxJuval Lowy。

问题是在服务器上,它能够毫无错误地调用回调,但客户端从未接收到它。如果在60秒内没有回调调用,则有代码尝试再次订阅。它的副作用是通过调用服务器上的Subscribe API来打开新连接。在一段时间内,您可以看到服务器上打开了许多TCP连接。没有错误,但仍然从不调用客户端回调。

附加信息

有时会抛出以下错误:

消息无法在分配的超时时间00:01:00内传输。可靠通道的传输窗口中没有可用空间。分配给此操作的时间可能是较长超时的一部分。

此外,MaxBufferPoolSize设置为Int64.MaxValue,如您在下面的代码中所见

var binding = new NetTcpBinding(SecurityMode.Transport, reliableSession);
binding.ReliableSession.Enabled = true;
binding.ReliableSession.InactivityTimeout = TimeSpan.FromDays(1);
binding.ReliableSession.Ordered = true;
binding.CloseTimeout = TimeSpan.FromHours(1);
binding.SendTimeout = TimeSpan.FromHours(1);
binding.ReceiveTimeout = TimeSpan.FromHours(1);
binding.OpenTimeout = TimeSpan.FromHours(1);
binding.ReaderQuotas.MaxDepth = Int32.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
binding.ReaderQuotas.MaxArrayLength = Int32.MaxValue;
binding.ReaderQuotas.MaxBytesPerRead = Int32.MaxValue;
binding.ReaderQuotas.MaxNameTableCharCount = Int32.MaxValue;
binding.MaxBufferPoolSize = Int64.MaxValue;
binding.MaxReceivedMessageSize = Int32.MaxValue;

任何建议都将大有帮助!

最近的发现:

我最近发现客户端的回调根据用户屏幕上的可见内容有不同类型的处理。这阻止了要确认的回调。这也解释了缓冲区溢出的原因。与每个客户端处理通知所花费的时间相比,从服务器发送通知的频率非常高。

除了我所做的更改,比如禁用安全性,正确配置超时,以下代码行帮助很大:

   public void OnNotification(AmigoMessage messsage)
    {
        ThreadPool.QueueUserWorkItem((x) => { ProcessNotification(messsage); });
    }

看看[CallbackBehavior(UseSynchronizationContext = false)]。回调服务上没有此属性将尝试封送(通常)到UI线程。

相关内容

  • 没有找到相关文章

最新更新