Переключиться с Visual Studio 2012 -> 2019 Сбой асинхронной задачи и FileResult - PullRequest
0 голосов
/ 01 июля 2019

Решение ASP.NET MVC, которое работало нормально в VS 2012, перестало работать в 2019 году, и я не могу найти, что изменилось, чтобы сломать его.

Первоначально у меня был код в первом блоке - асинхронная задачабудет идти в хранилище файлов и извлекать файл, а затем файл будет отправлен в браузер с помощью FileResult, который контроллер вызвал автоматически.После ОЧЕНЬ болезненных изменений в VS 2019 и обновления всего (среда выполнения .NET, сторонние библиотеки и т. Д.) Приложение снова работает, за исключением этой проблемы.

Я попытался создать новый FileStreamResult (который находится в2-й блок) но это тоже не вызывается.Когда я нажимаю на ссылку, которая вызывает это:

    <a href="/Cert/File?folder=&filename=@HttpUtility.UrlEncode(FilePath)" ...

Это дает мне пустую страницу вместо загрузки файла, как это было раньше.


        public async Task FileAsync(string folder, string filename)
        {
            AsyncManager.OutstandingOperations.Increment();

            var ReadObjectTask = _fileStorageProvider.ReadObjectDataAsync(folder, filename);
            Stream ROResult = await ReadObjectTask;
            AsyncManager.Parameters["stream"] = ROResult;
            AsyncManager.Parameters["filename"] = filename;

            AsyncManager.OutstandingOperations.Decrement();

        }
        public FileResult FileCompleted(Stream stream, string filename)
        {
            if (stream == null)
            {
                return File(Server.MapPath(Url.Content("~/Content/bad_file.png")), "image/png");
            }
            var file = new FileStreamResult(stream, MIMEAssistant.GetMIMEType(filename));
            if (filename.Contains("/"))
            {
                filename = filename.Split('/').Last();
            }
            file.FileDownloadName = filename;
            return file;
        }

Вот FileStreamResult, который я попробовал:

        public System.Web.Mvc.FileStreamResult FileCompleted(Stream stream, string contentType, string filename)
        {
            if (stream == null)
            {
                string bFile = Server.MapPath(Url.Content("~/Content/bad_file.png"));
                Stream blankfile = System.IO.File.OpenRead(bFile);
                return File(blankfile, MIMEAssistant.GetMIMEType(bFile), System.IO.Path.GetFileName(bFile));
            }
            if (filename.Contains("/"))
            {
                filename = filename.Split('/').Last();
            }
            return File(stream, MIMEAssistant.GetMIMEType(filename), filename);
        }

(Имя файла. Содержит часть старого кода предшественника, который мне просто нужно заменить на Path.GetFileName - извините, я не очистил его до публикации.)

Я решил сделать Async Task одним из типов и переместил потоковую обработку в эту процедуру, чтобы решить мою проблему.Я не знаю, почему асинхронная задача, которая работала в 2012 году, остановилась в 2019 году.

public async Task<FileResult> FileAsync(string folder, string filename)
        {
            AsyncManager.OutstandingOperations.Increment();

            var ReadObjectTask = _fileStorageProvider.ReadObjectDataAsync(folder, filename);
            Stream ROResult = await ReadObjectTask;
            AsyncManager.Parameters["stream"] = ROResult;
            AsyncManager.Parameters["filename"] = filename;
            AsyncManager.OutstandingOperations.Decrement();

            if (ROResult == null)
            {
                return File(Server.MapPath(Url.Content("~/Content/bad_file.png")), "image/png");
            }
            var file = new FileStreamResult(ROResult, MIMEAssistant.GetMIMEType(filename));
            file.FileDownloadName = System.IO.Path.GetFileName(filename);
            return file;

        }
...