HttpWebResponse - ограничение длины

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

HttpWebResponse - ограничение длины

Сообщение Qwertiy » 01.09.2011 (Чт) 20:50

Посылается запрос с указанием скачиваемого диапазона. Хочу во время скачивания уменьшить длину ответа, т. е. не скачивать в этом запросе весь кусок. Как сообщить об этом намерении Respons'у?

Из выполнения этого кода
Код: Выделить всё
Imports System.IO
Imports System.Net
Imports System.Threading

Module All

Public Sub Main()
  Dim Buf(16383) As Byte, Len As Integer

  Dim Request As HttpWebRequest = WebRequest.Create("http://www.gaudeamus.omskcity.com/lib-pdf/sciences/Lavrov_-_Programmirovanie_-_OsnovySredstvaTeoriya_-_314_PDF.zip")
  With Request
    .Method = WebRequestMethods.Http.Get
    .AddRange(1048576, 2097152)
  End With

  Dim Response As HttpWebResponse = Request.GetResponse()

  Dim Stream As Stream = Response.GetResponseStream()

  For Q As Integer = 0 To 8
    Len = Stream.Read(Buf, 0, 3)
    Thread.Sleep(6000)
  Next Q

  Response.Close()
End Sub

End Module
делаю вывод, что есть некий буфер, и скачивание идёт непрерывно, вне зависимости от того, что я считываю через Read.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: HttpWebResponse - ограничение длины

Сообщение iGrok » 01.09.2011 (Чт) 23:22

Эээ.. :shock:
Никак. Только разорвав соединение с сервером в процессе скачивания. У него что запросили, он то и отдаст.

Не могу назвать себя знатоком net, поэтому могу и ошибаться, но вообще говоря, к моменту возврата из Request.GetResponse() у тебя уже скачано всё, что запрошено. Запрос же синхронный.

А дальше ты просто читаешь данные из полученного буфера.
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.09.2011 (Чт) 23:38

iGrok писал(а):к моменту возврата из Request.GetResponse() у тебя уже скачано всё, что запрошено

Это не так.

iGrok писал(а):Только разорвав соединение с сервером в процессе скачивания. У него что запросили, он то и отдаст.

Мне не надо сообщать серверу. Мне надо просто перестать скачивать в тот момент, когда будет скачано достаточно. После этого разорвать соединение.

iGrok писал(а):А дальше ты просто читаешь данные из полученного буфера.

Буфер существует, но чтение из буферизированного потока, который не содержит все запрошенные данные. Они скачиваются параллельно. Кстати, скорее всего буфер ограничен. Меня устроит возможность управления его размером.

Ещё вопрос. Как узнать, сколько уже скачано (вместе с тем, что в буфере)?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: HttpWebResponse - ограничение длины

Сообщение FireFenix » 02.09.2011 (Пт) 0:26

Судя по наличию асинхронных методов в WebHtppRequest, то думаю реализуется идея так
http://msdn.microsoft.com/ru-ru/library ... ponse.aspx
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.09.2011 (Пт) 0:52

FireFenix, я не понимаю, как эта информация связана с тем, что я спрашиваю.
Мне не требуется асинхронное выполнение. Меня интересует как установить границу скачивания с учётом того, что скачивание уже происходит параллельно. Очевидно, что я могу не читать больше, чем требуется, но оно всё равно будет скачиваться и сохраняться в промежуточном буфере. Я хочу этого избежать.
Мне приходят в голову следующие враианты:
1. Как-то повлиять на HttpWebResponse или поток, получаемый через GetResponseStream. Например, непосредственно установив границу или с помощью управления размером буфера. В таком случае нужна возможность узнать, сколько данных уже есть в буфере.
2. Отключить буферизацию. Скачивание только во время выполнения Read.
3. Использовать другой механизм без неявной буферизации.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: HttpWebResponse - ограничение длины

Сообщение FireFenix » 02.09.2011 (Пт) 13:09

Qwertiy писал(а):FireFenix, я не понимаю, как эта информация связана с тем, что я спрашиваю.

Я думаю в прямом.

Каждый раз для чтения вызывается колбек функция, в которой мы указываем длину данных и наш буфер для чтения. Суммируя длину каждого вызова или отслуживая размер нашего буфера мы на некотором этапе прекращаем чтение.

Всё это дело читает, вызывая System.Connection.Read, поэтому есть ли буфер ещё ниже - не знаю.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.09.2011 (Пт) 13:24

FireFenix писал(а):Всё это дело читает, вызывая System.Connection.Read

Это где? Я вижу только чтение из
Код: Выделить всё
         ' Read the response into a Stream object.
         Dim responseStream As Stream = myRequestState.response.GetResponseStream()
         myRequestState.streamResponse = responseStream

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: HttpWebResponse - ограничение длины

Сообщение FireFenix » 02.09.2011 (Пт) 16:10

responseStream = HttpWebResponse.GetResponseStream -> ConnectStream
responseStream.BeginRead = ConnectStream.BeginRead -> Connection.BeginRead -> PooledStream.BeginRead -> NetworkStream.BeginRead -> Socket.BeginReceive
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.09.2011 (Пт) 19:47

1. Почему BeginRead должно отличаться от Read в плане наличия ещё одного буфера? Объект-то один и тот же. Кроме того, скачивание начинается до вызова Response.GetResponseStream(), после выполнения Request.GetResponse().
2. Тип потока ConnectStream, однако возвращается он как Stream и я не нашёл способ использовать тип ConnectStream в коде. Т. е. я могу сделать CType в окне Watch, но при компиляции получаю ошибку, что такой тип не существует.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: HttpWebResponse - ограничение длины

Сообщение FireFenix » 02.09.2011 (Пт) 20:30

Qwertiy писал(а):Почему BeginRead должно отличаться от Read в плане наличия ещё одного буфера?

Я сказал, что не знаю. Ибо прослоечных буферов может быть много. В подробности реализации не вдавался

Qwertiy писал(а):Кроме того, скачивание начинается до вызова Response.GetResponseStream(), после выполнения Request.GetResponse()

В синхронном (когда используется GetResponse) случае - да

Qwertiy писал(а):Тип потока ConnectStream, однако возвращается он как Stream и я не нашёл способ использовать тип ConnectStream в коде.

Зачем его использовать? Используй асинхронную конструкцию как предлагает мсдн

Qwertiy писал(а):ConnectStream. Т. е. я могу сделать CType в окне Watch, но при компиляции получаю ошибку

Потому что в пространстве имён объявлено Friend Class ConnectStream и доступ возможен только из того пространства, в котором находится этот класс
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.09.2011 (Сб) 15:47

FireFenix писал(а):В синхронном (когда используется GetResponse) случае - да

При выполнении
Код: Выделить всё
  Request.BeginGetResponse(Sub() MsgBox(""), Nothing)
  Thread.Sleep(600000)
  Exit Sub
скачивание идёт. Делаю вывод, что буфер всё равно есть.

FireFenix писал(а):Потому что в пространстве имён объявлено Friend Class ConnectStream и доступ возможен только из того пространства, в котором находится этот класс

И зачем это надо? Всё равно же CObj могу сделать и наслаждаться результатом. Только работать медленнее будет от этого, по сравнению с ConnectStream.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: HttpWebResponse - ограничение длины

Сообщение FireFenix » 04.09.2011 (Вс) 15:36

Qwertiy писал(а):скачивание идёт. Делаю вывод, что буфер всё равно есть.

Естественно, ты разве соединение разрываешь? Ты попросил тебе прислать пакеты и с чистой душой их ловишь

Изображение
Изображение


После добавления условия

Изображение
Изображение

Qwertiy писал(а):
FireFenix писал(а):Потому что в пространстве имён объявлено Friend Class ConnectStream и доступ возможен только из того пространства, в котором находится этот класс

И зачем это надо?

Я действительно знаю зачем MS это сделала во фреймворке :D

Qwertiy писал(а):Всё равно же CObj могу сделать и наслаждаться результатом.Только работать медленнее будет от этого, по сравнению с ConnectStream

Без рефлексии доступ именно к этому классу ты не получишь из другого пространства имён
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

    TopList  
cron