Solving "The underlying connection was closed" when using WSE
Some time ago I've posted a code snippet to solve following exception which in some cases can happen when you're calling a web service:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at ...
It seems that this exception also pops up when using Web Services Enhancements (WSE), but the solution I provided doesn't work in that case. You can't get directly to the underlying HttpWebRequest to set the KeepAlive property to false. But recently some people posted two solutions in the comments, so all kudos goes to these people, this time I'm just the messenger! Both solutions use Reflection to get a hold of the HttpWebRequest, nice work!
Solution by Skeup&Zeb
using System;
using System.Net;
using System.Reflection;
// Web service reference entered in wizard was "MyWebService.MyWebServiceWse"
using MyProject.MyWebService;
namespace MyProject
{
public class MySubClassedWebService : MyWebServiceWse {
private static PropertyInfo requestPropertyInfo = null;
public MySubClassedWebService(){}
protected override System.Net.WebRequest GetWebRequest(Uri uri) {
WebRequest request = base.GetWebRequest(uri);
if (requestPropertyInfo==null)
// Retrieve property info and store it in a static member for optimizing future use
requestPropertyInfo = request.GetType().GetProperty("Request");
// Retrieve underlying web request
HttpWebRequest webRequest =
(HttpWebRequest)requestPropertyInfo.GetValue(request,null);
// Setting KeepAlive
webRequest.KeepAlive = false;
return request;
}
}
}
Solution by Schwank:
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
PropertyInfo requestPropertyInfo = null;
WebRequest request = base.GetWebRequest(uri);
if (requestPropertyInfo==null)
requestPropertyInfo = request.GetType().GetProperty("Request");
// Retrieve underlying web request
HttpWebRequest webRequest = (HttpWebRequest)requestPropertyInfo.GetValue(request, null);
// Setting KeepAlive
webRequest.KeepAlive = false;
return request;
}