#c# #http #asp.net-core
#c# #http #asp.net-core
Вопрос:
Мне не хватает заголовка диапазона, когда браузер отправляет http-запрос.
Это заголовки, отправленные браузером:
GET /Shared/Files/DownloadFile/856 HTTP/1.1
Host: localhost:5001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5
Accept-Language: da,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://localhost:5001/Basic/Message/Details/611/
Range: bytes=0-
Connection: keep-alive
Cookie: Session=0af9f0f2-3201-43a9-b7af-e9d91390b42a
У меня есть собственная реализация IActionResult
public class PartialContentResult : IActionResult
{
public PartialContentResult(int id, AzurePrivateStorage azure)
{
this.id = id;
this.azure = azure;
}
public Task ExecuteResultAsync(ActionContext context)
{
var headers = context.HttpContext.Request.Headers;
// headers["Range"] always return StringValues.Empty
var range = headers["Range"].ToString();
// Why is Range always empty??
var match = Regex.Match(range, @"^bytes=(d*)-(d*)");
Task resu<
if (match.Success)
{
long? from = GetLongValue(match.Groups[1].Value);
long? to = GetLongValue(match.Groups[2].Value);
long? length = from - to;
result = azure.Download(id, context, from, length, context.HttpContext.RequestAborted);
}
else
{
result = azure.Download(id, context, context.HttpContext.RequestAborted);
}
return resu<
}
private long? GetLongValue(string value)
{
return string.IsNullOrEmpty(value) ? null : (long?)Convert.ToInt64(value);
}
}
headers["Range"]
всегда возвращайте StringValues.EmptyString
в ExecuteResultAsync
.
Запрос инициализируется из MVC. Это мой контроллер.
[UserAuthorize]
[Area("Shared")]
public class FilesController : Controller
{
public async Task<IActionResult> DownloadFile([FromServices] AzurePrivateStorage azure, int id)
{
try
{
await CheckDownloadAccess(id);
}
catch (UnauthorizedUserAccessException)
{
return StatusCode(StatusCodes.Status401Unauthorized);
}
catch (FileNotFoundException)
{
return StatusCode(StatusCodes.Status404NotFound);
}
return new PartialContentResult(id, azure);
}
[...]
}
Я пробовал как Kestrel, так и IIS Express, но результаты те же. Заголовок диапазона отсутствует на сервере.
Я использую .NET Core 3.1.4.
Комментарии:
1. Отсутствует откуда? Запрос или ответ?
IActionResult
используется для генерации ответа. Где код, который обрабатывает запрос?2. Спасибо за ваш комментарий. Я обновил исходное сообщение, чтобы включить часть контроллера.
3. Я попытался настроить простой проект на video response. Здесь сервер Kestrel не предоставляет заголовок диапазона, но IIS Express предоставляет заголовок диапазона. Проблема существует как в .NET Core 3.1.4, так и в .NET Core 5.0.0-предварительный просмотр.7 (последняя версия).
4. Если это действительно проблема Kestrel, вы сможете проверить это, вернув
File
результат сEnableRangeProcessing
значением set. Вы можете либо использовать перегрузку File() , которая принимаетenableRangeProcessing
, либо явно задать свойство для возвращаемогоFileResult
объекта. Одним из способов было быreturn File(...){EnableRangeProcessing=true};
5. Я настроил тестовый пример на github: github.com/hermandsen/RangeTest При
EnableRangeProcessing
включенном режиме заголовок диапазона не отправляется при запуске Kestrel.