1

我遇到了很多人都遇到过的问题,但是在线提供的所有解决方案都特定于他们的场景。我已经尝试了可用的建议,但我尝试过的仍然没有运气:

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 的相同对象背靠背使用,我会得到上述异常。我不确定是什么导致连接关闭,如果可能的话,我希望能够保持打开并使用解构器关闭它。

对于那些好奇此代码处理 Cisco Extension Mobility API 的人,第一种方法查询服务器以获取您登录的设备,第二种方法将用户从该设备中注销。

谢谢您的帮助。

4

2 回答 2

2

对每种方法使用不同的 HttpWebRequest。您不应该为不同的请求重用 HttpWebRequest 对象。检查这一点:我可以在不断开与服务器的连接的情况下重用 HttpWebRequest 吗?. 在内部,.NET 可以决定尽可能重用与同一服务器的连接,但服务器可以决定在每次请求后关闭连接,即使您指定 req.KeepAlive = true。

还要确保在方法中处理/关闭 WebResponse 对象。

于 2013-07-24T21:52:03.140 回答
1

我会首先在我的所有 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 任务。

我刚刚注意到您的代码以及为什么我认为您没有关闭。您正在调用 close ,然后尝试准备线路。这是一个很好的例子,说明为什么要养成使用“using”关键字的习惯。

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();
    }


}
于 2013-07-24T21:31:45.633 回答