WCF Service fails with a 1 hour timeout in 30 seconds
I am using a WCF Service locally to compute some information, this is C#, and return the data.
The data I am returning is a list of a list of floats List<List< float>>
, a total of 4 of these. Each list of floats contains 400 items and there are 180 of these lists in each collection. So 4 of List<List<float>>
's
I originally had an insufficient space error and then updated the size to a maxmimum of 2,000,000 bytes.
<?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" transactio开发者_运维问答nProtocol="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>
I also have updated this in my host manually setting these values.
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();
}
I have also set the timeouts to 1 hr and 10 minutes.
The error I get is
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 '01:09:59.9770000'.
Now this timeout occurs within 30 seconds. I have a unit test I am running and the Service does everything correctly and the reply contains valid data, however when it returns this reply I always get this error.
I have been searching and I cannot get any answer that resolves as the ones I have seen just inform me to increase the buffer/timeouts which I have.
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.
<serviceBehaviors>
<behavior name="MyBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
Just follow the following link, wish it helps:
http://davybrion.com/blog/2008/09/wcf-and-large-amounts-of-data/
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's sendTimeout
.
精彩评论