Решение 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;
}