System.Net.WebException: The request was aborted: the request was cancelled

Viewed 36518

I have a WCF service that has been giving me this error under load conditions (and I can't seem to recreate the error otherwise). We've been trying to find a way around it for about a week now with no such luck..

The error I see has two parts to it,

System.ServiceModel.CommunicationException: An error: (The request was aborted: the request was cancelled.) occurred while transmitting data over the http channel.

and:

System.Net.WebException: The request was aborted: the request was cancelled.

I've seen many people suggest to disable working with keep alive by overloading a method in the Reference.cs file and setting KeepAlive = false, however, our client side is using a service reference (in addition to web reference) and this option does not exist anymore.

Another option I've seen was to add a custom Binding to the service instead of the BasicHttpBinding we are using now, but that would bother backwards support of the webservice to those who have been using a webReference (since CustomBinding is not SOAP enabled).

Has anyone dealt with this error before? Is there a way to disable keep alive in WCF without affecting the server side? Is there anything other that keep alive that is known to cause this error?

5 Answers

This error can also be caused by mixing using clauses with asynchronous calls to WCF services.

For example:

using (ServiceClient proxy = new ServiceClient(proxyName)) {
  proxy.Open();
  return proxy.FunctionCallAsync(parameters); //Return type being Task<ResultSet>
}

This will trigger a race condition between how fast can it dispose of proxy versus how fast the asynchronous Task<ResultSet> can be completed. Longer the task takes the more likely it will be to end up in a Faulted state and the Result containing a System.ServiceModel.CommunicationException.

This can be fixed by removing the using clause:

ServiceClient proxy = new ServiceClient(proxyName))
proxy.Open();
return proxy.FunctionCallAsync(parameters); //Return type being Task<ResultSet>

Note that proxy should be persisted too so that once the asynchronous call is completed that a proxy.Close() can be done.

Related