Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WCF Service , how to increase the timeout?

Tags:

wcf

Might seem like a silly question, but everything in WCF seems a lot more complicated than in asmx, how can I increase the timeout of an svc service?

Here is what I have so far:

<bindings>       <basicHttpBinding>         <binding name="IncreasedTimeout"            openTimeout="12:00:00"            receiveTimeout="12:00:00" closeTimeout="12:00:00"           sendTimeout="12:00:00">         </binding>       </basicHttpBinding> </bindings> 

And then my endpoint gets mapped like this:

<endpoint address=""    binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"              contract="ServiceLibrary.IDownloads">              <identity>                 <dns value="localhost" />              </identity>           </endpoint> 

The exact error I am getting:

The request channel timed out while waiting for a reply after 00:00:59.9990000. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.

In the WCF Test Client, there is a config icon that contains the run time configuration of my service:

As you can see its not the same values as I've set for it? What am I doing wrong?

<bindings>             <basicHttpBinding>                 <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"                     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"                     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"                     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"                     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"                     useDefaultWebProxy="true">                     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"                         maxBytesPerRead="4096" maxNameTableCharCount="16384" />                     <security mode="None">                         <transport clientCredentialType="None" proxyCredentialType="None"                             realm="">                             <extendedProtectionPolicy policyEnforcement="Never" />                         </transport>                         <message clientCredentialType="UserName" algorithmSuite="Default" />                     </security>                 </binding>             </basicHttpBinding>         </bindings> 
like image 858
JL. Avatar asked Oct 05 '09 14:10

JL.


People also ask

What is the default timeout for WCF service?

The most common default timeout values within Archiver are: 2 min for querying the Microsoft SQL Server. 5 min for WCF connections (This is used heavily for internal communication between GFI Archiver's own modules).

What is ReceiveTimeout in WCF service?

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.

What is WCF service?

Windows Communication Foundation (WCF) is a framework for building service-oriented applications. Using WCF, you can send data as asynchronous messages from one service endpoint to another. A service endpoint can be part of a continuously available service hosted by IIS, or it can be a service hosted in an application.


2 Answers

In your binding configuration, there are four timeout values you can tweak:

<bindings>   <basicHttpBinding>     <binding name="IncreasedTimeout"              sendTimeout="00:25:00">     </binding>   </basicHttpBinding> 

The most important is the sendTimeout, which says how long the client will wait for a response from your WCF service. You can specify hours:minutes:seconds in your settings - in my sample, I set the timeout to 25 minutes.

The openTimeout as the name implies is the amount of time you're willing to wait when you open the connection to your WCF service. Similarly, the closeTimeout is the amount of time when you close the connection (dispose the client proxy) that you'll wait before an exception is thrown.

The receiveTimeout is a bit like a mirror for the sendTimeout - while the send timeout is the amount of time you'll wait for a response from the server, the receiveTimeout is the amount of time you'll give you client to receive and process the response from the server.

In case you're send back and forth "normal" messages, both can be pretty short - especially the receiveTimeout, since receiving a SOAP message, decrypting, checking and deserializing it should take almost no time. The story is different with streaming - in that case, you might need more time on the client to actually complete the "download" of the stream you get back from the server.

There's also openTimeout, receiveTimeout, and closeTimeout. The MSDN docs on binding gives you more information on what these are for.

To get a serious grip on all the intricasies of WCF, I would strongly recommend you purchase the "Learning WCF" book by Michele Leroux Bustamante:

Learning WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

and you also spend some time watching her 15-part "WCF Top to Bottom" screencast series - highly recommended!

For more advanced topics I recommend that you check out Juwal Lowy's Programming WCF Services book.

Programming WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

like image 135
marc_s Avatar answered Sep 28 '22 00:09

marc_s


The best way is to change any setting you want in your code.

Check out the below example:

using(WCFServiceClient client = new WCFServiceClient ()) {      client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30); } 
like image 28
user3891644 Avatar answered Sep 28 '22 00:09

user3891644