Как настроить правильный объект HTTP Response для запроса Range, поступающего от BITS (Background Intelligent Transfer Service)?

У меня есть требование реализовать веб-сервис, который может выдавать файлы на биты (фоновая интеллектуальная служба передачи). Язык ASP.NET (C#). Проблема, с которой я сталкиваюсь, связана с "диапазоном".

Мой код в настоящее время получает запрос http (с допустимым диапазоном в заголовках http от 0 до 4907), а затем выделяет часть байтового массива в объекте ответа.

Вот мой код сервера:

_context.Response.Clear();
_context.Response.AddHeader("Content-Range", "bytes " + lower.ToString() + "-" +  upper.ToString() + "//" + view.Content.Length.ToString());
_context.Response.AddHeader("Content-Length", upper.ToString());
_context.Response.AddHeader("Accept-Ranges", "bytes");
_context.Response.ContentType = "application/octet-stream";
_context.Response.BinaryWrite(data);
_context.Response.End();

Затем происходит следующее: в последующем запросе вообще нет ключа "диапазона" в заголовке... как будто он запрашивает весь файл! Само собой разумеется, ошибки задания битов, заявляющие, что ответ сервера был недействительным.

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

Если кто-то может помочь с этим, это будет высоко ценится... в то время как... Я буду продолжать поиск!

С уважением

2 ответа

Решение

Да, я обнаружил, что у меня было всего несколько проблем. Первоначальной проблемой была IIS, затем мои расчеты длины... и затем, как вы говорите, запрос диапазона - это сам. Игнорируя последнее, мой окончательный код для этого сегмента был:

_context.Response.StatusCode = 206;
_context.Response.AddHeader("Content-Range", string.Format("bytes {0}-{1}/{2}", lower.ToString(), upper.ToString(), view.Content.Length.ToString()));
_context.Response.AddHeader("Content-Length", length.ToString());
_context.Response.AddHeader("Accept-Ranges", "bytes");
_context.Response.OutputStream.Write(view.Content.ToArray(), lower, length);

Обработка диапазонов нескольких запросов может быть решена в другой день! Если BITS запрашивает таким образом (как это происходит во втором запросе после первого запроса, который запрашивает весь файл), мой код просто ничего не возвращает... и затем BITS отправляет один диапазон в запросе... все работает нормально оттуда.

Спасибо за ответ.

Вы также можете протестировать ваши запросы BITS для известного статического файла и прослушать пакеты с помощью WireShark. Это точно покажет, как именно это сделать.

Другие вопросы по тегам