Оптимизация HttpWebResponse — GetResponse
-
19-09-2019 - |
Вопрос
Я использую следующие строки кода для чтения ответа асинхронного запроса 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);
}