WCF 服务在 30 秒内失败并出现 1 小时超时
我在本地使用 WCF 服务来计算一些信息,这是 C#,并返回数据。
我返回的数据是浮点数列表 List
,一共4个。每个浮动列表包含 400 个项目,每个集合中有 180 个这样的列表。因此,我最初遇到了 4 个 List
List
List
List
List
List
List
>
List
>
空间不足的错误,然后将大小更新为最大 2,000,000 字节。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IExternalBallistics" closeTimeout="01:10:00"
openTimeout="01:10:00" receiveTimeout="01:10:00" sendTimeout="01:10:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="2000000" maxBufferSize="2000000" maxConnections="10"
maxReceivedMessageSize="2000000">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:6100/ExternalBallistics"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IExternalBallistics"
contract="IExternalBallistics" name="NetTcpBinding_IExternalBallistics" />
</client>
</system.serviceModel>
</configuration>
我还在我的主机中手动更新了这些值。
private void InitializeServiceHost()
{
if (_serviceHost != null)
{
_serviceHost.Close();
}
Uri address = new Uri("net.tcp://localhost:6100/ExternalBallistics");
NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
binding.MaxReceivedMessageSize = 2000000;
binding.MaxBufferSize = 2000000;
binding.MaxBufferPoolSize = 2000000;
binding.CloseTimeout = new TimeSpan(1, 10, 0);
binding.OpenTimeout = new TimeSpan(1, 10, 0);
binding.ReceiveTimeout = new TimeSpan(1, 10, 0);
binding.SendTimeout = new TimeSpan(1, 10, 0);
_serviceHost = new ServiceHost(typeof(ExternalBallisticsImpl), address);
_serviceHost.Description.Behaviors.Add(GetMetadataBehavior());
_serviceHost.CloseTimeout = new TimeSpan(1, 10, 0);
_serviceHost.OpenTimeout = new TimeSpan(1, 10, 0);
_serviceHost.AddServiceEndpoint(typeof(IExternalBallistics), binding, address);
_serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
_serviceHost.Open();
}
我还将超时设置为 1 小时 10 分钟。
我得到的错误是
套接字连接被中止。这可能是由于处理消息时出错、远程主机超出接收超时或底层网络资源问题造成的。本地套接字超时为“01:09:59.9770000”。
现在此超时发生在 30 秒内。我正在运行一个单元测试,并且服务正确执行所有操作,并且回复包含有效数据,但是当它返回此回复时,我总是收到此错误。
我一直在搜索,但无法得到任何可以解决的答案,因为我看到的答案只是告诉我增加我拥有的缓冲区/超时。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
虽然它被报告为超时异常,但这可能是另一个问题。
您是否尝试设置 maxItemsInObjectGraph 以确保您可以发送大型对象图。
只需点击以下链接,希望有帮助:
http: //davybrion.com/blog/2008/09/wcf-and-large-amounts-of-data/
Although it's reported as time out exception, it may be another issue.
Would you try Set set the maxItemsInObjectGraph to make sure that you can send a large object graph.
Just follow the following link, wish it helps:
http://davybrion.com/blog/2008/09/wcf-and-large-amounts-of-data/
正如 @Tim 在他的评论中所建议的,这可能是服务器在大约 30 秒后无法与客户端通信的问题。客户端可能已经关闭了其连接。
确保客户端上的绑定设置与服务器上的绑定设置相匹配。特别是,请确保客户端的
receiveTimeout
值类似于服务器的sendTimeout
。As @Tim suggested in his comment, this might be a problem of the server not being able to talk to the client after ~30 seconds. The client may have already closed its connection.
Make sure that the binding settings on the client match those of the server. Especially, make sure that the client's
receiveTimeout
value resembles the server'ssendTimeout
.