Domanda

Sto utilizzando le seguenti righe di codice per leggere la risposta di un asincrona HttpWebRequest. Questa sembra essere la più grande quantità di tempo trascorso in una determinata operazione. C'è qualcosa che posso ottimizzare qui?

System.Net.HttpWebResponse oResp =(System.Net.HttpWebResponse)oReq.EndGetResponse(oResult);
oResp = (HttpWebResponse)oReq.GetResponse();
StreamReader oStreamReader = new StreamReader(oResp.GetResponseStream());
string sResponse = oStreamReader.ReadToEnd();

... continua a fare un XmlDocument, aggiungere un po 'di XML ad esso, quindi eseguire una trasformazione XSL.

Creare le connessioni:

HttpWebRequest oReq;
oReq = (HttpWebRequest)WebRequest.Create(sUrl + sQueryString);
oReq.ContentType = sContentType;
oReq.Method = "POST";
oReq.ContentLength = aBytes.Length;
Stream oStream = oReq.GetRequestStream();
oStream.Write(aBytes, 0, aBytes.Length);
oStream.Close();
AsyncState oState = new AsyncState(oReq);
return oReq.BeginGetResponse(fCallBack, oState);
È stato utile?

Soluzione

Ho trovato un miglioramento importante per il sistema che stavo usando. Invece di utilizzare lo StreamReader e ReadToEnd per ottenere il flusso in una stringa, solo allora per convertirlo in un XmlDocument. Ho saltato l'uomo medio e convertito il flusso direttamente in un XmlDocument.

Questo mi ha lasciato con un altro problema, però, ho dovuto cambiare il genitore del XmlDocument per adattare il mio Xslt (ci sono un gran numero, e tutti si aspettano che la struttura che ho avuto). Vedi Come posso aggiungere nuovo elemento root per un C # XmlDocument ? per quella correzione.

Questo mi ha dato un grosso modo 2/3 diminuzione del tempo necessario per elaborare i risultati della chiamata webservice, e una grande diminuzione della quantità di memoria utilizzata. Nella versione precedente, la risposta è stata xml in memoria due momenti diversi (forse tre se la conta stream)!

In aggiunta, la rimozione del più GetResponse sembrava aiutare.

using (HttpWebResponse oResp = (HttpWebResponse)oReq.EndGetResponse(oResult))
{
oXml.Load(oResp.GetResponseStream());
XmlNode oApiResult = oXml.RemoveChild(oXml.DocumentElement);
oXml.LoadXml(sOtherXml);
oXml.DocumentElement.AppendChild(oApiResult);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top