Ausnahme:"Die Anfrage wurde abgebrochen: Die Verbindung wurde unerwartet geschlossen" Beim aufrufen der beiden Methoden dasselbe Objekt
Ich habe ein problem, dass viele Menschen erlebt haben, aber alle die Lösung, die online verfügbar sind, sind auf Ihre spezifische Szenarien. Ich habe versucht, die Vorschläge zur Verfügung, aber noch kein Glück in der wha, die ich versucht habe war:
1.) req.KeepAlive = false;
2.) req.ProtocolVersion = HttpVersion.Version10; (this solved a different exception that I was getting)
Habe ich zwei Methoden der übergabe von XML-string an den server und antwortet wieder die beiden Methoden sind:
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;
}
UND
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();
}
Beide sind Teil einer Klasse namens EMAPI. Ich kann beide Methoden verwenden nur fein getrennt, aber wenn Sie versuchen, verwenden Sie back-to-back mit dem gleichen Objekt, EMAPI bekomme ich die exception wie oben beschrieben. Ich bin mir nicht sicher, was die Ursache für die Verbindung zu schließen, würde ich mag in der Lage sein, um Sie öffnen und schließen es mit einem de-Konstruktor, wenn möglich.
Für diejenigen, die neugierig sind, dieser code befasst sich mit Cisco Extension Mobility-API, die erste Methode fragt den server ab, um ein Gerät, mit dem Sie angemeldet sind, die zweite Methode meldet den Benutzer von diesem Gerät.
Danke für die Hilfe.
- Auf einem nicht verwandten note, die ich verwenden würde, die Klasse stringbuilder für effizient, wenn gebaut, riesige + Streicher.
- Können Sie bitte näher auszuführen, warum ist StringBuidler besser ist, wenn die Verkettung von strings?
- dotnetperls.com/stringbuilder-performance
- Haben Sie überprüfen Sie den Zustand der Verbindung nach dem ersten Aufruf. Es kann der Fall, dass die Verbindung geschlossen durch remote-server.
- Oh wow, ich habe über 15 Anfragen in meinem code mit string, werde ich alle beheben. Das könnte lösen die Langsamkeit, die ich erlebe. Tahnks!!
- Die Verbindung wird automatisch geschlossen nach Aufruf einer Methode, das ist, warum ich bin nicht in der Lage, rufen Sie die zweite Methode. Ich bin nicht sicher, warum es schließt sich automatisch. Ich kann instanziieren der EMAPI wieder und rufen Sie die zweite Methode, aber es muss eine bessere Lösung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie eine andere HttpWebRequest-Klasse für jede Methode. Sollten Sie nicht die Wiederverwendung der HttpWebRequest-Objekt für unterschiedliche Anforderungen. Überprüfen Sie dies: Kann ich die Wiederverwendung HttpWebRequest-ohne abklemmen vom server?. Intern .NET entscheiden kann, um die Verbindung erneut verwenden, um den gleichen server, wenn möglich, aber der server kann entscheiden, schließen Sie die Verbindung nach jeder Anfrage, auch wenn Sie erf.KeepAlive = true.
Auch sicher, dass Sie veräußern/schließen Sie Ihre WebResponse-Objekt in Ihre Methoden.
Wäre ich mit der 'mit' - Schlüsselwort, um alle meine IDisposables ersten off. Zweitens sieht, wie Sie sind, lassen Sie die StreamReaders öffnen.
Bearbeiten
Beantworten Sie die Bemerkung über die Verwendung von Schlüsselwort.
Stattdessen:
Schreiben Sie es auf diese Weise:
Dem using-Schlüsselwort wird automatisch Griff alle IDisplosable Aufgabe für Sie.
Mir ist gerade aufgefallen, was Ihren code, und warum ich dachte, Sie waren nicht mehr schließen. Sie sind dem Aufruf schließen und dann versuchen, bereit den Zeilen. Dies ist ein gutes Beispiel, warum man in die Gewohnheit, mit Hilfe der 'mit' - Schlüsselwort.
NOCH EIN EDIT