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

时间:2014-06-13 08:43:20

标签: c# asmx webservice-client

我知道之前已经提出过这个问题,并且已经提出了很多建议,但是我已经尝试了所有这些问题而没有任何工作,所以我试图看看是否有人对此事有额外的了解。

方案: 我有一个控制台应用程序,我在其中添加了一个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);
            }

        }

使用调试器,我可以清楚地看到调用,并返回一个有效的数据表,但是当最后一个return语句生成时,代码进入catch块,但“底层连接已关闭” :预计将保持活动状态的连接被服务器关闭。“被抛出

框架是4.5。

我还可以采取哪些其他建议来防止抛出异常?

2 个答案:

答案 0 :(得分:1)

解决方案是一系列变化:

1)正如Kirill建议的那样,添加数据表的名称

2)在服务中使用dt.WriteXml(writer, XmlWriteMode.WriteSchema, false);,生成XML字符串

3)使用

using (StringReader r = new StringReader(XMLSerializedResult))
        {
            dt.ReadXml(XmlReader.Create(r));
        }

在客户端中反序列化XML字符串。

谢谢大家的建议。

答案 1 :(得分:0)

结帐Closing WCF connection。基本上,当使用块调用Dispose时会发生这种情况。解决方案:跳过使用并根据需要调用.Close或.Abort。

MSDN链接:http://msdn.microsoft.com/en-us/library/aa355056.aspx