-->

异常:“请求已中止:连接被意外关闭”当调用两个方法相同的对象(Exception:“The requ

2019-10-18 10:30发布

我有很多人都经历过,但所有的解决方案是在网上提供特定于其场景的一个问题。 我曾尝试建议可用,但仍然没有运气WHA我已经试过了:

1.) req.KeepAlive = false;
2.) req.ProtocolVersion = HttpVersion.Version10; (this solved a different exception that I was getting)

我有两种方法传递XML字符串到服务器,并得到响应返回给两种方法是:

public string userDeviceQuery(string userID)
    {
        string query = "xml=<query>";
        query += "<appInfo>";
        query += "<appID>" + appID + "</appID>";
        query += "<appCertificate>" + appCertificate + "</appCertificate>";
        query += "</appInfo>";
        query += "<userDevicesQuery>";
        query += "<userID>";
        query += userID;
        query += "</userID>";
        query += "</userDevicesQuery>";
        query += "</query>";

        using (Stream str = req.GetRequestStream())
        {
            str.Write(System.Text.Encoding.ASCII.GetBytes(query), 0, query.Length);
        }

        WebResponse res = req.GetResponse();

        string stringResponse;
        using (StreamReader reader = new StreamReader(res.GetResponseStream()))
        {
            stringResponse = reader.ReadToEnd();
        }

        string result = parseDeviceQueryRes(stringResponse);
        return result;
    }

public void logoutOfEM(string deviceName)
    {
        string lgRequest = "xml=<request>";
               lgRequest += "<appInfo>";
               lgRequest += "<appID>" + appID + "</appID>";
               lgRequest += "<appCertificate>" + appCertificate + "</appCertificate>";
               lgRequest += "</appInfo>";
               lgRequest += "<logout>";
               lgRequest += "<deviceName>";
               lgRequest += deviceName;
               lgRequest += "</deviceName>";
               lgRequest += "</logout>";
               lgRequest += "</request>";

         using (Stream str = req.GetRequestStream())
        {
            str.Write(System.Text.Encoding.ASCII.GetBytes(lgRequest), 0, lgRequest.Length);
        }

        WebResponse res = req.GetResponse();

        using (StreamReader reader = new StreamReader(res.GetResponseStream()))
        {
            stringResponse = reader.ReadToEnd();
        }
        string stringResponse = reader.ReadToEnd();
    }

他们是一个叫EMAPI类的两个组成部分。 我可以用这两种方法就好分开,但如果试图使用他们回来到后端与同代表对象EMAPI我得到上述例外。 我不知道是什么原因造成的连接关闭,我希望能够保持它的开放和使用去构造如果可能的话将其关闭。

对于那些谁是好奇与思科分机移动API这段代码交易,第一种方法查询服务器,以获取你登录的设备,第二个方法注销德用户取出设备。

谢谢您的帮助。

Answer 1:

使用不同的HttpWebRequest为每个方法。 你不应该重复使用不同的请求HttpWebRequest对象。 检查: 我可以重复使用的HttpWebRequest不从服务器断开? 。 在内部,.NET可以决定重用,想尽量在同一台服务器的连接,但服务器可以决定关闭每个请求之后的连接,即使您指定req.KeepAlive =真。

另外,还要确保你处置/关闭WebResponse对象在你的方法。



Answer 2:

我会是第一个使用围绕我所有的IDisposables的“使用”关键字。 其次看起来,你是离开StreamReaders开放。

编辑

要回答有关使用关键字,您发表评论。

取而代之的是:

Stream str = req.GetRequestStream();
str.Write(System.Text.Encoding.ASCII.GetBytes(lgRequest), 0, lgRequest.Length);
str.Close();

写这样说:

using(Stream str = req.GetRequestStream())
{
    str.Write(System.Text.Encoding.ASCII.GetBytes(lgRequest), 0, lgRequest.Length);
}

using关键字会自动处理所有IDisplosable任务给你。

我只是发现了一些你的代码,为什么我还以为你不关闭。 要调用关闭,然后试图准备的线条。 这就是为什么要进使用“使用”关键字的习惯,一个很好的例子。

StreamReader reader = new StreamReader(res.GetResponseStream());
reader.Close(); //Calling CLOSE before trying to use the reader
string stringResponse = reader.ReadToEnd();

第二个编辑

public void logoutOfEM(string deviceName)
    {
        string lgRequest = "xml=<request>";
               lgRequest += "<appInfo>";
               lgRequest += "<appID>" + appID + "</appID>";
               lgRequest += "<appCertificate>" + appCertificate + "</appCertificate>";
               lgRequest += "</appInfo>";
               lgRequest += "<logout>";
               lgRequest += "<deviceName>";
               lgRequest += deviceName;
               lgRequest += "</deviceName>";
               lgRequest += "</logout>";
               lgRequest += "</request>";
     using (Stream str = req.GetRequestStream())
    {
        str.Write(System.Text.Encoding.ASCII.GetBytes(lgRequest), 0, lgRequest.Length);
    }

    WebResponse res = req.GetResponse();

    var response = string.Empty;
    using(StreamReader reader = new StreamReader(res.GetResponseStream()))
    {
        response = reader.ReadToEnd();
    }


}


文章来源: Exception:“The request was aborted: The connection was closed unexpectedly” When invoking two methods same object