Потоковая передача больших файлов ISO ASP. Net Core - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь транслировать большие ISO-файлы (~ 4 Гб). Поэтому я следовал этой статье https://dotnetcoretutorials.com/2017/03/12/uploading-files-asp-net-core/ (Потоковые файлы (большие файлы) - часть, которая меня интересовала). Мой контроллер выглядит следующим образом:

        [HttpPost]
        [DisableFormValueModelBinding]
        [Authorize]
        [RequestFormLimits(MultipartBodyLengthLimit = 5368709000)]
        [RequestSizeLimit(5368709000)]
        [Route("{clusterId}/image_library/upload_image")]
        [ProducesResponseType(typeof(AsyncOperationResult), 200)]
        [ProducesResponseType(typeof(OperationResult), 400)]
        [ProducesResponseType(typeof(string), 401)]
        public IActionResult UploadFile()
        {
            bool result = Request.StreamFile("E:\\").Result; / extension method

            if (result)
            {
                return Ok();
            }

            return BadRequest();
            bool result=  Request.StreamFile("E:\\").Result; /extension method

            if (result)
            {
                return Ok();
            }

            return BadRequest();
        }

Атрибут DisableFormValueModelBinding реализован следующим образом:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            var formValueProviderFactory = context.ValueProviderFactories
                .OfType<FormValueProviderFactory>()
                .FirstOrDefault();
            if (formValueProviderFactory != null)
            {
                context.ValueProviderFactories.Remove(formValueProviderFactory);
            }

            var jqueryFormValueProviderFactory = context.ValueProviderFactories
                .OfType<JQueryFormValueProviderFactory>()
                .FirstOrDefault();
            if (jqueryFormValueProviderFactory != null)
            {
                context.ValueProviderFactories.Remove(jqueryFormValueProviderFactory);
            }
        }

        public void OnResourceExecuted(ResourceExecutedContext context)
        {
        }
    }

И мой Kestrel настроен так:

hostBuilder.UseKestrel(options =>
                {
                    options.AddServerHeader = false;
                    options.Listen(ipAddress, ProviderSettings.API_port);
                    options.Listen(ipAddress, ProviderSettings.API_SSL_port, listenOptions =>
                    {
                        listenOptions.UseHttps(sslSert);
                    });
                    options.Limits.MaxRequestBodySize = null;
                })
                .UseContentRoot(contentRootPath)
                .ConfigureLogging(logging =>
                {
                    // Remove default Microsoft Logger
                    logging.ClearProviders();
                });

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

Проверено промежуточное программное обеспечение: никто не перенастраивает настройки Kestrel, тот же код отлично работает в другом проекте (я должен что-то упустить). Есть идеи?

...