Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > WebRequest stream.Read зависает


Автор: Gleb 1.8.2010, 19:54
Всем привет.
Работаю с яндексом по http с помощью WebRequest и на коротких ответах на POST-запрос приложение зависает на минуту в последней итерации чтения из потока (там, где будет numberOfBytesRead = 0)
Все варианты перепробовал, надежда только на общественность.

При чтении результата в ответ на GET все хорошо, причем ответ такой же длины. Да что уж там, он идентичен.

Код

using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
                {
                    using (var documentStream = webResponse.GetResponseStream())
                    {
                        using (var ms = new MemoryStream())
                        {
                            var bytesToRead = new byte[buferSize];
                            var numberOfBytesRead = 0;
                            
                            do
                            {
                                numberOfBytesRead = documentStream.Read(bytesToRead, 0, buferSize);       //<--- зависает на последней итерации
                                ms.Write(bytesToRead, 0, numberOfBytesRead);
                            }
                            while (numberOfBytesRead > 0);

                            ms.Seek(0, SeekOrigin.Begin);
                            using (var sr = new StreamReader(ms, Encoding.UTF8))
                            {
                                var documentXmlString = sr.ReadToEnd();
                                sr.Close();
                                result = XDocument.Parse(documentXmlString);
                            }
                        }
                    }
                }


Вот так я создаю запрос:
Код

private HttpWebRequest CreateRequest(string url, HttpMethod method, AuthorizationOptions authorization, string content)
        {
            var result = (HttpWebRequest)HttpWebRequest.Create(url);
            result.Method = method.ToString();
            result.ContentType = "application/atom+xml; charset=utf-8; type=feed";
            result.KeepAlive = false;
            result.AllowWriteStreamBuffering = false;
            result.Proxy = GlobalProxySelection.GetEmptyWebProxy();

            if (method == HttpMethod.POST)
                result.ContentType = "application/atom+xml; charset=utf-8; type=entry";
            
            result.ServicePoint.Expect100Continue = false;

            if (authorization == AuthorizationOptions.Required)
                result.Headers.Add("Authorization", string.Format("FimpToken realm=\"fotki.yandex.ru\", token=\"{0}\"", _authorizationContext.Token));

            if (!string.IsNullOrEmpty(content))
            {
                var queryBytes = Encoding.UTF8.GetBytes(content);
                result.ContentLength = queryBytes.Length;
                result.GetRequestStream().Write(queryBytes, 0, queryBytes.Length);
            }

            return result;
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)