Search code examples
c#wcfservicetimeout

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" 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>

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.


Solution

  • 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/