Pregunta

Estoy usando las siguientes líneas de código para leer la respuesta de un asincrónica HttpWebRequest. Esta parece ser la más grande cantidad de tiempo invertido en una operación en particular. ¿Hay algo que pueda hacer para optimizar aquí?

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

... va a hacer un XmlDocument, agregue un poco más de XML para que, a continuación, realizar una transformación XSL.

La creación de las conexiones:

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);
¿Fue útil?

Solución

He encontrado una mejora importante con el esquema que estaba usando. En lugar de utilizar el StreamReader y ReadToEnd para obtener la secuencia en una cadena, sólo entonces para convertirlo en un XmlDocument. Me salté el hombre medio y se convierte la corriente directa en un XmlDocument.

Esto me dejó con otro problema, sin embargo, tuve que cambiar la matriz de la XmlDocument para adaptarse a mi Xslt (hay un gran muchos y todos ellos esperan que la estructura que tenía). Ver ¿Cómo puedo añadir nuevo elemento raíz de un C # XmlDocument ? para esa solución.

Esto me ha dado una disminución de aproximadamente 2/3 del tiempo necesario para procesar los resultados de la llamada de servicio web, y una gran disminución en la cantidad de memoria utilizada. En la versión anterior, la respuesta fue xml en memoria dos momentos diferentes (tal vez tres si el recuento de corriente)!

Además, la eliminación de la GetResponse adicional parecía ayudar.

using (HttpWebResponse oResp = (HttpWebResponse)oReq.EndGetResponse(oResult))
{
oXml.Load(oResp.GetResponseStream());
XmlNode oApiResult = oXml.RemoveChild(oXml.DocumentElement);
oXml.LoadXml(sOtherXml);
oXml.DocumentElement.AppendChild(oApiResult);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top