HttpWebRequest к веб-сервису в c #;как получить данные БЫСТРО из потока ответов? - PullRequest
1 голос
/ 05 декабря 2011

Я звоню в веб-сервис с POST и получаю 2MB xml.Проблема в том, что это займет много времени, пока я не смогу использовать данные в потоке.Кажется, что ответ идет через 7 секунд, но для считывания содержимого (его строки) из потока ответов требуется еще 10 секунд.

Stopwatch s = new Stopwatch();

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(MyUri);
req.Method = "POST";

req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = Poststring.Length;
s.Start();
StreamWriter swriter = new StreamWriter(req.GetRequestStream());
swriter.Write(Poststring);
swriter.Close();

// Get the response. 7 sec
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
s.Stop();
Debug.WriteLine("Talking to Web-Service: "+s.ElapsedMilliseconds);

s.Reset(); 
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);

// Read the content.  10 sec
XmlReader xmlReader = XmlReader.Create(dataStream);
s.Start();
XDocument xdoc = XDocument.Load(xmlReader);
s.Stop(); 
Debug.WriteLine("Convert stream to some useful data: "+s.ElapsedMilliseconds);

вывод в миллисекундах

Talking to Web-Service: 6595
"Convert" stream to some useful data: 10772

Почему чтение содержимого занимает около 10 секунд?Есть ли еще какая-то связь с веб-сервисом или ожидание данных при чтении контента?Это простой текстовый файл (xml) размером около 2 МБ.Я думал, что эти 2 МБ были переданы в течение 6596 миллисекунд.Потому что, когда я вызываю эту службу через мой браузер, содержимое xml показывается через 6-7 секунд.

Время разговора с веб-службой в порядке, но что происходит в эти 10772 миллисекунды?

Редактировать: Проблема все еще там.Я получаю разные ответы, и они противоречат друг другу.

Ответы [ 3 ]

1 голос
/ 10 декабря 2011

Добавить следующее

httpWebRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

, в результате чего:

Talking to Web-Service: 6595
"Convert" stream to some useful data: 256

Теперь у меня такая же производительность, как в браузере!

0 голосов
/ 06 декабря 2011

GetResponse не вернет полный поток ответа.GetResponse отправит ваш запрос и вернет объект HttpWebResponse на основе информации заголовка из ответа.HttpWebResponse также имеет связанный поток, из которого вы можете прочитать полное тело ответа.Это именно то, что вы делаете.

Я подозреваю, что 7-секундная задержка, которую вы наблюдаете при вызове GetResponse, является задержкой на сервере при создании XML-документа и отправке ответа.Дополнительная 10-секундная задержка на XmlReader.Create связана с чтением потока ответов (т. Е. С загрузкой файла).

Генерируется ли XML динамически?7 секунд - это не очень долгое время для ответа HTTP, в зависимости, конечно, от местоположения вашего сервера, качества и т. Д.

0 голосов
/ 06 декабря 2011
XDocument xdoc = XDocument.Load(response.GetResponseStream(), LoadOptions.None);

Избегайте XmlReader.Create и используйте перегрузку XDocument.Load (Stream, LoadOptions).http://msdn.microsoft.com/en-us/library/cc838321.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...