Клиент BITS не может указать заголовок диапазона HTTP - PullRequest
2 голосов
/ 08 марта 2010

Наша система предназначена для развертывания в регионах с ненадежными и / или недостаточными сетевыми подключениями. Мы создаем наши собственные отказоустойчивые службы репликации данных, которые используют BITS .

Из-за некоторых требований безопасности и обслуживания мы внедрили нашу собственную службу загрузки файлов ASP.NET на стороне сервера, вместо того, чтобы просто разрешать IIS обслуживать файлы. Когда клиент BITS делает запрос на загрузку HTTP с указанным диапазоном файла наша страница ASP.NET извлекает требуемый сегмент файла в память и служит этим ответом HTTP. Это теория. ;) Эта теория не работает в искусственных лабораторных сценариях, но я бы не позволил системе развернуться в реальных сценариях, если мы не сможем преодолеть это.

Лабораторный сценарий: у меня BITS-клиент и IIS на одной машине разработчика, поэтому практически у меня огромная «пропускная способность» сети, и BITS достаточно умен, чтобы это обнаружить. Поскольку клиент BITS обнаруживает неограниченную пропускную способность, он становится все более «жадным». При каждом HTTP-запросе BITS хочет охватывать все больший и больший диапазон файлов (речь идет о загрузке iso-файлов CD, видео), требуя 20-40 МБ в одном HTTP-запросе, размер, который мне неудобно загружать в память на стороне сервера, как один раз. Я могу преодолеть это, просто давая меньше, чем требовалось. Это нормально.

Однако, BITS получает действительно «уверенные» и «высокомерные» требовательные файлы, БЕЗ указания диапазона загрузки , то есть, он хочет получить весь файл за один запрос, и именно здесь все идет не так. Я не знаю, как ответить на этот ответ в случае файла 600 МБ. Если я просто предоставляю начальный диапазон файла в 1 МБ, клиент BITS продолжает отправлять HTTP-запросы на один и тот же файл без диапазона загрузки для продолжения, он забивает свою мысль о том, что ему нужен весь файл за один раз. Поскольку я неохотно предоставляю весь файл, BITS сдается после нескольких попыток и сообщает об ошибке.

Есть мысли?

1 Ответ

3 голосов
/ 10 марта 2010

Кажется, мы могли бы решить проблему. Есть несколько вещей:

  • Нам нужно было контролировать каждый входящий запрос, поэтому мы не могли просто позволить IIS обрабатывать запрос в одиночку. Однако по-прежнему нет необходимости извлекать файлы в память только для облегчения загрузки: Request.TransferFile (...) фактически выполняет всю тяжелую работу, не вытягивая файлы в память, в то время как мы все еще сохраняем контроль над обработкой запроса.
  • Внедрение BITS выглядит очень умно, как обрабатывать различные случаи. Мы узнали, что если BITS запрашивает полный файл без указания диапазона, даже если он составляет несколько ГБ, мы можем просто позволить ему его получить. Как только он получает первые HTTP-пакеты и выясняет, что это больше, чем он может проглотить, он немедленно отменяет запрос и повторно запрашивает его с соответствующим диапазоном.
  • БИТЫ позволяют настроить максимальную пропускную способность и планировать, когда разрешено использование сетевых ресурсов. Хотя эта конфигурация применима к клиентской стороне, в нашем конкретном случае все в порядке.
...