我有一个由 Windows 服务托管的 WCF 服务。它与网络中的零到多个客户端具有发布/订阅关系。绑定(bind)是 net.TCP。 WCF 服务向客户端提供“订阅”方法,以便客户端可以注册回调处理程序。 WCF 服务定期调用任何当前订阅客户端的回调处理程序中的方法。
接口(interface)定义(带缩写)如下:
[OperationContract(IsOneWay = false)]
void ReturnInitialData(
InitialData initialData,
CraneState recentState,
VerticalCraneState recentVerticalCraneState,
ThresholdState recentThresholdState,
StationaryStatusFlagsState recentStationaryStatusFlagState,
LightsState recentLights,
BarrierRiskState recentBarrierRiskState
);
当服务使用大约 42000 字节的数据调用 ReturnInitialData() 时,它工作正常。当服务用大约 70000 字节的数据调用它时,它会抛出以下异常:
The socket connection was aborted. This could be caused by an
error processing your message or a receive timeout being
exceeded by the remote host, or an underlying
network resource issue. Local socket timeout was '00:10:00'.
这是 netTcpBinding 配置:
General
CloseTimeout 00:00:20
HostNameComparisonMode StrongWildcard
ListenBacklog 0
MaxBufferPoolSize 524288
MaxBufferSize 2147483647
MaxConnections 0
MaxReceivedMessageSize 2147483647
OpenTimeout 00:01:00
PortSharingEnabled False
ReceiveTimeout 00:10:00
SendTimeout 00:10:00
TransactionFlow False
TransactionProtocol Ole Transactions
TransferMode Buffered
ReaderQuotas Properties
MaxArrayLength 0
MaxBytesPerRead 0
MaxDepth 0
MaxNameTableCharCount 0
MaxStringContentLength 0
ReliableSession Properties
Enabled False
InactivityTimeout 00:10:00
Ordered True
欢迎任何线索或指点。
最佳答案
adkSerenity 和 shambulator,
谢谢。我发现了问题。原来是缓冲区大小。我很确定这不是超时,因为最短的超时设置为一分钟,我可以在三十秒内重现错误。
我一直在避免使用 WCF 跟踪和消息日志记录,因为它们太吓人了。要读的东西太多,时间太少。 ;-}
当我生成输出并用查看器查看它时,它也可能是火星人。一头雾水研究了一会儿,终于有了印象,通信中断不是服务的错。然后灯泡亮了,我检查了客户端的配置文件。果然,MaxBufferSize 设置为 65535,有效截断了 70000 字节的消息。
再次感谢您为我指明了正确的方向。
关于c# - netTCPBinding 配置无法传输小型数据 - 套接字连接已中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19940548/