Вопрос

Я использую следующие строки кода для чтения ответа асинхронного запроса 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);
Это было полезно?

Решение

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

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

Это дало мне примерно на 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top