我遇到了很多人都遇到的问题,但是在线提供的所有解决方案都是针对他们的方案而定的。我已经尝试了可用的建议但仍然没有运气我曾尝试过:
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,第一种方法是查询服务器以获取您登录的设备,第二种方法是将用户从该设备中记录下来。
感谢您的帮助。
答案 0 :(得分:2)
为每种方法使用不同的HttpWebRequest。您不应该将HttpWebRequest对象重用于不同的请求。检查一下:Can I reuse HttpWebRequest without disconnecting from the server?。在内部,.NET可以决定在可能的情况下重用连接到同一服务器,但是服务器可以决定在每次请求后关闭连接,即使您指定req.KeepAlive = true。
还要确保在方法中处置/关闭WebResponse对象。
答案 1 :(得分:1)
我首先会在我的所有IDisposable周围使用'using'关键字。其次看起来你要打开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任务。
我刚注意到你的代码,以及为什么我认为你没有关闭。你正在呼叫关闭,然后尝试准备线路。这是为什么养成使用'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();
}
}