What are the default timeouts in .Net code if you don't specify one? I realised I didn't know, when I got timeouts for an HttpClient calling a WCF service calling a SQL query. The choices are all reasonable. But they're all different. So here's a list.
System.Net.Http.HttpClient
.Timeout
Default 100 seconds
The entire time to wait for the request to complete.
https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout?view=netframework-4.5 (if your url requires a DNS call and you set timeout < 15 seconds, your timeout may be ineffective; it may still take up to 15 seconds to timeout.)
System.Data.SqlClient SqlConnection & SqlCommand
SqlConnection.ConnectionTimeout
Default 15 seconds
The timeout to wait for a connection to open.
https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.connectiontimeout?view=netframework-1.1
SqlCommand.CommandTimeout
Default 30 seconds
The wait time before terminating the attempt to execute a command and generating an error.
Remarks & Notes
- A value of 0 indicates no limit (an attempt to execute a command will wait indefinitely).
- The
CommandTimeout
property will be ignored during asynchronous method calls such asBeginExecuteReader
. CommandTimeout
has no effect when the command is executed against a context connection (a SqlConnection opened with "context connection=true" in the connection string).- This is the cumulative time-out (for all network packets that are read during the invocation of a method) for all network reads during command execution or processing of the results. A time-out can still occur after the first row is returned, and does not include user processing time, only network read time. For example, with a 30 second time out, if
Read
requires two network packets, then it has 30 seconds to read both network packets. If you callRead
again, it will have another 30 seconds to read any data that it requires.
WCF
IDefaultCommunicationTimeouts
This interface does not, of course, set any default values, but it does define the meaning of the four main timeouts applicable to WCF.
- CloseTimeout : the interval after which the
close
method times out. - OpenTimeout : the interval after which the
open
method times out. - ReceiveTimeout : the interval after which the
receive
method times out. - SendTimeout : the interval after which the
send
method times out.
https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.idefaultcommunicationtimeouts?view=netframework-3.0
System.ServiceModel.Channels.Binding Default values
Remember, timeouts in WCF apply at the level of the Binding
used by the client or service. (Think about it. It makes sense).
So the Binding
class defaults affect all your WCF operations unless a specific binding subclass changes it. Subclasses include: BasicHttpBinding, WebHttpBinding, WSDualHttpBinding, all other HttpBindings, all MsmqBindings, NetNamedPipeBinding, NetPeerTcpBinding, NetTcpBinding, UdpBinding, and CustomBindings.
https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.channels.binding?view=netframework-3.0
The defaults are:
OpenTimeout 1 minute
CloseTimeout 1 minute
SendTimeout 1 minute
ReceiveTimeout 10 minutes
However whilst some bindings - basicHtp, netTcp– specify the same—1 min, 1min, 1min, 10 minutes—as Binding
base class …
WCF Service Timeouts for webHttpBinding
, wsDualHttpBinding
and other bindings
The documentation for these bindings contradict (or should I say, override) the documentation for the framework classes and say that all four timeouts, including ReceiveTimeout
, default to 1 minute. It could be a typo, I haven't tested. See all the various bindings at https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/bindings.
webHttpBinding vs basicHttpBinding Reminder: webHttpBinding
is for simple (so-called rest-style) HTTP requests as opposed to Soap. basicHttpBinding
is for SOAP, i.e.conforming to the WS-I Basic Profile 1.1.
WCF Client Timeouts
A WCF client uses three of these Timeout settings. Since the default value is set by the Binding, what remains is to clarify the definitions.
- SendTimeout : used to initialize the OperationTimeout, which governs the whole process of sending a message, including receiving a reply message for a request/reply service operation. This timeout also applies when sending reply messages from a callback contract method.
- OpenTimeout – used when opening channels
- CloseTimeout – used when closing channels
ReceiveTimeout is meaningless for a client and is not used.
WCF Serverside Timeouts
A WCF service uses all four Timeout settings. Three have the same definition as a WCF Client. The fourth is:
- ReceiveTimeout : used by the Service Framework Layer to initialize the session-idle timeout which controls how long a session can be idle before timing out.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/configuring-timeout-values-on-a-binding
WCF using a Binding with reliableSession
Some System.ServiceModel.Bindings allow the use of ReliableSession behaviour, which adds another timeout:
InactivityTimeout
defaults to 10 minutes.
Remarks
- Activity on a channel is defined as receiving an application or infrastructure message. The inactivity timeout parameter controls the maximum amount of time to keep an inactive session alive. If more than
InactivityTimeout
time interval passes with no activity, the session is aborted by the infrastructure and the channel faults. The reliable session is torn down unilaterally. - If the sending application has no messages to send then the reliable session is normally not faulted because of inactivity; instead a keep-alive mechanism keeps the session active indefinitely. Note that the dispatcher can independently abort the reliable session if no application messages are sent or received. Thus, the inactivity timeout typically expires if network conditions are such that no messages are received or if there is a failure on the sender.
but:
WCF Server using HttpBinding with reliableSession
implemented as Connection: Keep-Alive
HTTP header
BasicHttpBinding does not use any kind of session so receiveTimeout should be irrelevant.
BasicHttpBinding can use HTTP persistent connection. Persistance is provided by Connection: Keep-Alive
HTTP header which allows sharing single TCP connection for many HTTP requests/responses. There appears to be no way to change the timeout associated with this header, and IIS appears to always timeout at 100 seconds of inactivity. IIS's keep-alive default timeout value is 120s, but changing this seems to have no effect on the WCF service.
The interesting thing is that closing proxy/channel on the client side does not close the TCP connection. The connection is still opened and prepared to be used by another proxy to the same service. The connection closes when 100s inactivity timeout expires or when application is terminated. Btw. there is RFC which defines that max. two such TCP connections can exists between client and single server (this is default behavior in windows but can be changed).
You can turn off HTTP persistent connection if you implement cutomBinding and set keepAliveEnabled="false" in httpTransport element. This will force client to create new TCP connection for each HTTP request.
IIS Timeouts
https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/weblimits
connectionTimeout
: Default 2 minutes.
Specifies the time (in seconds) that IIS waits before it disconnects a connection that is considered inactive. Connections can be considered inactive for the following reasons:
- The HTTP.sys Timer_ConnectionIdle timer expired. The connection expired and remains idle.
- The HTTP.sys Timer_EntityBody timer expired. The connection expired before the request entity body arrived. When it is clear that a request has an entity body, the HTTP API turns on the Timer_EntityBody timer. Initially, the limit of this timer is set to the connectionTimeout value. Each time another data indication is received on this request, the HTTP API resets the timer to give the connection more minutes as specified in the connectionTimeout attribute.
- The HTTP.sys Timer_AppPool timer expired. The connection expired because a request waited too long in an application pool queue for a server application to dequeue and process it. This time-out duration is connectionTimeout.
headerWaitTimeout
: Default 0 seconds
ToDo: Does this mean none, or does it mean no timeout until the connectionTimeout is hit?
IIS Asp.Net HttpRuntime
executionTimeout: 110 seconds in .Net framework 2.0 & 4.x. In the .NET Framework 1.0 and 1.1, the default is 90 seconds
- the maximum number of seconds that a request is allowed to execute before being automatically shut down by ASP.NET.
- This time-out applies only if the debug attribute in the compilation element is False. To help to prevent shutting down the application while you are debugging, do not set this time-out to a large value
https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.0/e1f13641(v=vs.85)
IIS WebSockets
pingInterval: default is 0 seconds.
IIS Classic Asp
queueTimeout : default value is 0.
The maximum period of time (hh:mm:ss) that an ASP request can wait in the request queue.
scriptTimeout : default value is 1 minute 30 seconds
The maximum period of time that ASP pages allow a script to run run before terminating the script and writing an event to the Windows Event Log.
IIS FastCGI
https://docs.microsoft.com/en-us/iis/configuration/system.webserver/fastcgi/application/index
activityTimeout: The default value in IIS 7.0 is 30seconds ; the default for IIS 7.5 is 70 seconds.
The maximum time, in seconds, that a FastCGI process can take to process.
idleTimeout: default 300 seconds.
The maximum amount of time, in seconds, that a FastCGI process can be idle before the process is shut down
requestTimeout: default 90 seconds
The maximum time, in seconds, that a FastCGI process request can take.
Http Server 408 Request Timeout
https://tools.ietf.org/html/rfc7231#section-6.5.7
The 408 (Request Timeout) status code indicates that the server did not receive a complete request message within the time that it was prepared to wait. A server SHOULD send the "close" connection option (Section 6.1 of [RFC7230]) in the response, since 408 implies that the server has decided to close the connection rather than continue waiting. If the client has an outstanding request in transit, the client MAY repeat that request on a new connection.
See Also
- All WCF timeouts explained
- Comment below on TransactionScope
TransactionScope = 60 seconds capped at a configurable 10min in app, further extended by machine config.
Now you know.
👍!