Я пытаюсь загрузить очень большие файлы ( > 2 ГБ) в мое приложение WebAPI (работающий на .NET 4.5.2, Windows 2012R2).
Установка свойства httpRuntime maxRequestLength бесполезна, поскольку он работает только с файлами размером менее 2 ГБ.
В настоящее время я использую настраиваемый файл MultipartFormDataStreamProvider для чтения всего потока на сервере, и я уже отключил буферизацию с помощью настраиваемого WebHostBufferPolicySelector.
Я обнаружил, что ASP.NET(или WebAPI) использует HttpBufferlessInputStream под капотом, у которого есть поле с именем _disableMaxRequestLength. Если я установил для этого значения значение true (через отражение), я могу передавать файлы любого размера.
Однако, сражаться с ними с помощью этих внутренних дел явно не очень хорошо.
Класс HttpRequest, используемый для запроса, имеет метод GetBufferlessInputStream, который имеет перегрузку, которая позволяет отключить maxRequestLength.
Мой вопрос: как я могу заставить WebAPI использовать эту перегрузку вместо стандартного?
Есть ли способ заменить класс HttpRequest по умолчанию или класс HttpContext? Или мне действительно нужно использовать отражение для всего материала?
Это код, который я использую сейчас для отключения maxRequestLength:
private void DisableRequestLengthOnStream(HttpContent parent)
{
var streamContentProperty = parent.GetType().GetProperty("StreamContent", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
if (streamContentProperty == null) return;
var streamContent = streamContentProperty.GetValue(parent, null);
if (streamContent == null) return;
var contentProperty = typeof(StreamContent).GetField("content", BindingFlags.Instance | BindingFlags.NonPublic);
if (contentProperty == null) return;
var content = contentProperty.GetValue(streamContent);
if (content == null) return;
var requestLengthField = content.GetType().GetField("_disableMaxRequestLength", BindingFlags.Instance | BindingFlags.NonPublic);
if (requestLengthField == null) return;
requestLengthField.SetValue(content, true);
}