我有一个简单的WCF服务,可以将图像流式传输到客户端。在客户端上,对图像的第一个请求大约需要 5.5 秒,然后后续请求大约需要 40 毫秒,这很棒。
但是,每 ~45 秒后,无论是否发出了任何请求,下一个请求始终需要大约 4.6 秒。这个 45 秒的循环不断重复。
我正在使用带有流式传输模式的 net.tcp 绑定。我还尝试了启用/不使用可靠会话的缓冲传输模式,但这一切都增加了每个请求所需的时间。
我尝试增加每个绑定超时(打开、关闭、发送、接收、不活动),但没有变化。
服务器配置:
serviceHost = new ServiceHost(typeof(TServiceImplementation), serviceUri);
serviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = false });
var netTCPBinding = new NetTcpBinding(SecurityMode.Transport);
netTCPBinding.TransferMode = TransferMode.StreamedResponse;
netTCPBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
serviceHost.AddServiceEndpoint(typeof(TServiceContract), netTCPBinding, ServiceName);
serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
客户端配置:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="TcpBinding" transferMode="StreamedResponse" maxReceivedMessageSize="2147483647" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://hostname:9000/StreamService"
binding="netTcpBinding" bindingConfiguration="TcpBinding" contract="StreamService.IStream"
name="NetTcpBinding_IStream" />
</client>
</system.serviceModel>
更新:看起来这可能是特定于计算机的问题 - 当我在本地计算机上运行该服务时,我没有遇到此问题。
,所以进行了更多的调查,我已经确定这是一个地址解析问题 - 实际映像托管在与运行该服务的机器不同的计算机上,因此我将配置更改为使用主机的 IP 地址而不是计算机名称,问题已解决。
我猜这与名称缓存超时有关,但还没有研究可能是哪一个。