在物理机A上作为控制台运行WCF服务(NET:TCP | Reliable | SecurityEnabled)
通过Citrix公开了20-30个.NET客户端应用程序(Winforms),因此在与服务器不同的一台物理计算机上再次托管。
应用程序结构遵循Juval Lowy在http://msdn.microsoft.com/en-us/magazine/cc163537.aspx中讨论的相同模式。
问题出现在服务器上,它能够在没有错误的情况下调用回调,但客户端从不接收它。如果60secs内没有回调调用,代码会尝试再次订阅。它有副作用,它通过调用服务器上的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;
任何建议都会有很大的帮助!
答案 0 :(得分:3)
我最近发现客户端的回调基于用户屏幕上可见的内容进行了不同类型的处理。这阻碍了回调被承认。这也解释了缓冲区溢出。与每个客户端处理它们所花费的时间相比,从服务器发送的通知的频率非常高。
除了我做的更改,我确实禁用了安全性,正确配置超时,以下代码行帮助了很多:
public void OnNotification(AmigoMessage messsage)
{
ThreadPool.QueueUserWorkItem((x) => { ProcessNotification(messsage); });
}
答案 1 :(得分:1)
看看[CallbackBehavior(UseSynchronizationContext = false)]
。在回调服务上没有此属性将尝试编组(通常)UI线程。