Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web服务调用中引发的基础连接关闭异常_C#_Asmx_Webservice Client - Fatal编程技术网

C# web服务调用中引发的基础连接关闭异常

C# web服务调用中引发的基础连接关闭异常,c#,asmx,webservice-client,C#,Asmx,Webservice Client,我知道以前有人问过这个问题,也提出过很多建议,但我都试过了,没有一个奏效,所以我想看看是否有人对这件事有额外的了解 情景: 我有一个控制台应用程序,其中添加了对ASMXWeb服务的web引用。 在控制台应用程序中,我生成了如下派生类: public class OverridenWebRequestReporting : webservice.Reporting { public OverridenWebRequestReporting(string addr) : ba

我知道以前有人问过这个问题,也提出过很多建议,但我都试过了,没有一个奏效,所以我想看看是否有人对这件事有额外的了解

情景: 我有一个控制台应用程序,其中添加了对ASMXWeb服务的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);
            }

        }
使用调试器,我可以清楚地看到调用已经发出,并且它返回了一个有效的datatable,但是当发出最后一个return语句时,代码进入catch块,除了“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”之外

框架是4.5

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

请签出。基本上,当使用块调用Dispose时会发生这种情况。解决方案:跳过使用并调用。根据需要关闭或。中止


MSDN链接:

解决方案是一系列更改的组合:

1) 正如Kirill所建议的,向datatable添加一个名称

2) 使用
dt.WriteXml(writer,XmlWriteMode.WriteSchema,false),以生成XML字符串

3) 使用

在客户端中对XML字符串进行反序列化


谢谢大家的建议。

有时,当您尝试将服务添加为服务引用时,代码生成器会抛出相同的异常,但会显示一条详细消息。我的猜测是,您的返回值中有无法序列化到客户端的内容,或者您访问了在返回完成之前释放的惰性变量。console应用程序只是一个“测试环境”。这是一个古老的遗产。我可以简单地将其添加为服务引用。你认为这可能会对通话产生负面影响吗?我刚刚添加了一个asmx作为网络参考。原因(我花了一段时间才记住:P)是我无法将对System.ServiceModel的引用添加到我的应用程序中。发送到客户端的所有内容都必须可序列化,因为客户端必须知道将数据重新生成为正确数据类型的规则。我认为数据表是不可序列化的。如果不再抛出异常,则可能将结果作为一个concatated字符串返回以进行测试,这将使您走上正确的轨道。
DataTable
序列化很好。不过,您必须遵循某些规则,例如在服务器端设置
TableName
属性(这是过去对我影响最大的一个)。我尝试过删除using块(实际上,它在开始时不存在),但它仍然会命中catch块。我只是添加了using块,希望这能解决这个问题。事实并非如此。。。
using (StringReader r = new StringReader(XMLSerializedResult))
        {
            dt.ReadXml(XmlReader.Create(r));
        }