Question

J'utilise les lignes de code ci-dessous pour lire la réponse asynchrone HttpWebRequest. Cela semble être la plus grande quantité de temps passé dans une opération particulière. Est-ce que je peux optimiser ici?

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

... continue à faire un XmlDocument, ajoutez un peu plus à XML, puis effectuer une transformation XSL.

Création des liaisons:

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);
Était-ce utile?

La solution

J'ai trouvé une grande amélioration au régime que j'utilisais. Plutôt que d'utiliser la StreamReader et ReadToEnd pour obtenir le flux dans une chaîne, alors seulement pour le convertir en un XmlDocument. Je sautais l'homme du milieu et converti directement le flux dans un XmlDocument.

Cela me reste un autre problème cependant, je devais changer le parent du XmlDocument pour adapter mon Xslt (il y a un grand nombre et ils attendent tous la structure que j'avais). Voir Comment puis-je ajouter un nouvel élément racine à un C # XmlDocument pour ce correctif.

Cela m'a donné une à peu près 2/3 diminution du temps nécessaire pour traiter les résultats de l'appel webservice, et une grande diminution de la quantité de mémoire utilisée. Dans la version précédente, le fichier XML de réponse a été en mémoire deux fois différents (peut-être trois si le nombre de cours d'eau)!

En outre, la suppression GetResponse supplémentaire semblait aider.

using (HttpWebResponse oResp = (HttpWebResponse)oReq.EndGetResponse(oResult))
{
oXml.Load(oResp.GetResponseStream());
XmlNode oApiResult = oXml.RemoveChild(oXml.DocumentElement);
oXml.LoadXml(sOtherXml);
oXml.DocumentElement.AppendChild(oApiResult);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top