0

Я использую следующие строки кода для чтения ответа асинхронного HttpWebRequest. Это, по-видимому, наибольшее время, затрачиваемое на конкретную операцию. Есть ли что-то, что я могу оптимизировать здесь?Оптимизация 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(); 

... далее сделать 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); 
+0

Чтобы ответить на это, вам необходимо собрать дополнительную информацию. Задержка происходит на клиенте или на сервере? вы упомянули, что вам нужно создать XML-документ - это сервер, создающий этот документ «на лету», или он служит для хранения документа с диска? Вы проходите через прокси? Вы используете аутентификацию? Вы используете Tcp для поддержания связей? Связано с этим, этот запрос выполняется в цикле, или это одноразовое приложение, которое делает только этот запрос и заканчивается? Показать свой фрагмент кода о том, как вы создаете свой запрос. И мы можем взять его дальше оттуда. – feroze

+0

Также, почему вы вызываете EndGetResponse(), а затем GetResponse() снова? Это неверное использование API. – feroze

+0

Дополнительная информация: Сервер генерирует xml на лету. Я не использую прокси. Вызовы аутентифицированы. Соединения не поддерживаются. Соединения одноразовые, не более одного соединения на каждый груз. Я добавил выше, как создается запрос. – aepheus

ответ

0

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

Это оставило меня с другой проблемой, хотя мне пришлось изменить родителя XmlDocument, чтобы он соответствовал моему Xslt (их очень много, и все они ожидают, что у меня была структура). См. How can I add new root element to a C# XmlDocument? для этого исправления.

Это дало мне примерно 2/3 снижение времени, затрачиваемого на обработку результатов вызова webservice, и значительное уменьшение объема используемой памяти. В предыдущей версии ответ 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); 
} 
Смежные вопросы