在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.

我还能做些什么来防止抛出异常,有什么建议吗?

在web服务调用中抛出的底层连接关闭异常

解决方案是组合更改:

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