在web服务调用中抛出的底层连接关闭异常
本文关键字:连接 异常 服务 web 调用 | 更新日期: 2023-09-27 18:08:31
我知道以前有人问过这个问题,也有很多建议,但我都试过了,没有一个有效,所以我想看看是否有人对这件事有额外的了解。
场景:我有一个控制台应用程序,我在其中添加了一个对ASMX web服务的web引用。在控制台应用程序中,我生成了一个派生类,如下所示:
public class OverridenWebRequestReporting : webservice.Reporting
{
public OverridenWebRequestReporting(string addr)
: base(addr)
{
}
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
webRequest.KeepAlive = false;
webRequest.ProtocolVersion = HttpVersion.Version10;
webRequest.ServicePoint.ConnectionLimit = 1;
return webRequest;
}
}
web服务方法的调用如下:
OverridenWebRequestReporting reportingService = new OverridenWebRequestReporting("http://some_web_location_where_the_service_is_deployed/Reporting.svc");
CredentialCache cache = new CredentialCache();
cache.Add(new Uri("http://some_web_location_where_the_service_is_deployed/Reporting.svc"), "NTLM",new NetworkCredential("username", "password", "domain"));
reportingService.Credentials = cache;
System.Net.ServicePointManager.Expect100Continue = false;
DataTable dt = new DataTable();
using (reportingService)
{
try
{
dt = reportingService.GetAllDocumentsMetadataFromSP("someString", "anotherString");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
使用调试器,我可以清楚地看到调用被执行了,并且它返回了一个有效的数据表,但是当最后一个返回语句被执行时,代码进入了catch块,并抛出了一个异常"底层连接被关闭:一个预期保持活动的连接被服务器关闭了"。
框架是4.5.
我还能做些什么来防止抛出异常,有什么建议吗?
解决方案是组合更改:
1)按照Kirill的建议,给数据表
添加一个名称2)在服务中使用dt.WriteXml(writer, XmlWriteMode.WriteSchema, false);
,生成XML字符串
3)
using (StringReader r = new StringReader(XMLSerializedResult))
{
dt.ReadXml(XmlReader.Create(r));
}
来反序列化XML字符串。
谢谢大家的建议。
查看正在关闭WCF连接。基本上,这发生在using块调用Dispose时。解决方法:跳过使用,根据需要调用。close或。abort。
MSDN链接:http://msdn.microsoft.com/en-us/library/aa355056.aspx