Оптимизация HttpWebResponse - GetResponse - PullRequest
0 голосов
/ 09 февраля 2010

Я использую следующие строки кода, чтобы прочитать ответ асинхронного запроса HttpWebRequest. Это, кажется, самое большое количество времени, затрачиваемое на конкретную операцию. Есть ли что-нибудь, что я могу оптимизировать здесь?

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

... продолжает создавать XmlDocument, добавлять к нему еще XML, а затем выполнять XSL-преобразование.

Создание соединений:

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);

1 Ответ

0 голосов
/ 16 февраля 2010

Я обнаружил одно существенное улучшение схемы, которую я использовал. Вместо того чтобы использовать StreamReader и ReadToEnd, чтобы получить Stream в строку, только затем преобразовать его в XmlDocument. Я пропустил посредника и превратил Stream прямо в XmlDocument.

Это оставило меня с другой проблемой, хотя мне пришлось изменить родителя XmlDocument, чтобы он соответствовал моему Xslt (их очень много, и все они ожидают структуру, которую я имел). См. Как добавить новый корневой элемент в C # XmlDocument? для этого исправления.

Это дало мне примерно 2/3 сокращение времени, необходимого для обработки результатов вызова веб-службы, и значительное уменьшение объема используемой памяти. В предыдущей версии xml-ответ находился в памяти два раза (возможно, три, если поток считается)!

Кроме того, удаление лишнего GetResponse, похоже, помогло.

using (HttpWebResponse oResp = (HttpWebResponse)oReq.EndGetResponse(oResult))
{
oXml.Load(oResp.GetResponseStream());
XmlNode oApiResult = oXml.RemoveChild(oXml.DocumentElement);
oXml.LoadXml(sOtherXml);
oXml.DocumentElement.AppendChild(oApiResult);
}
...