0

J'utilise les lignes de code suivantes pour lire la réponse d'un HttpWebRequest asynchrone. Cela semble être la plus grande quantité de temps passé dans une opération particulière. Y a-t-il quelque chose que je peux optimiser ici?Optimisation de HttpWebResponse - GetResponse

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 à 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); 
+0

Pour répondre à cette question, vous devez collecter plus d'informations. Le délai se produit-il sur le client ou le serveur? Vous avez mentionné que vous devez créer un document XML: le serveur génère-t-il ce document à la volée ou sert-il un document à partir du disque? Passez-vous par un proxy? Utilisez-vous l'authentification? Utilisez-vous les connexions Tcp keep alive? En relation avec ceci, est-ce que cette demande est faite dans une boucle, ou est-ce une application unique qui fait juste cette demande et se termine? Afficher votre extrait de code de la façon dont vous créez votre demande. Et nous pouvons aller plus loin à partir de là .. – feroze

+0

Aussi, pourquoi appelez-vous EndGetResponse(), puis GetResponse() à nouveau? Ce n'est pas une utilisation correcte de l'API. – feroze

+0

Plus d'informations: Le serveur génère le fichier XML à la volée. Je n'utilise pas de proxy. Les appels sont authentifiés. Les connexions ne sont pas conservées. Les connexions sont uniques, pas plus d'une connexion est établie par charge. J'ai ajouté ci-dessus comment la requête est créée. – aepheus

Répondre

0

J'ai trouvé une amélioration majeure au régime que j'utilisais. Plutôt que d'utiliser StreamReader et ReadToEnd pour placer le Stream dans une chaîne, il suffit ensuite de le convertir en XmlDocument. J'ai sauté l'intermédiaire et converti le Stream directement dans un XmlDocument. Cela m'a laissé avec un autre problème, j'ai dû changer le parent du XmlDocument pour s'adapter à mon Xslt (il y en a beaucoup et ils attendent tous la structure que j'avais). Voir How can I add new root element to a C# XmlDocument? pour ce correctif.

Cela m'a donné une réduction d'environ 2/3 du temps nécessaire pour traiter les résultats de l'appel de service web, et une grande diminution de la quantité de mémoire utilisée. Dans la version précédente, la réponse xml était en mémoire deux fois différentes (peut-être trois si le flux compte)!

En outre, supprimer le GetResponse supplémentaire a semblé 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); 
}