一个在 VS 2012 中运行良好的 ASP.NET MVC 解决方案在 2019 年停止运行,我找不到改变它的原因。
最初我在第一个块中有代码 - 异步任务将转到文件存储并检索文件,然后使用控制器自动调用的 FileResult 将文件发送到浏览器。在对 VS 2019 进行了非常痛苦的更改并更新了所有内容(.NET 运行时、第 3 方库等)之后,我让应用程序再次运行,除了这个问题。
我尝试创建一个新的 FileStreamResult (位于第二个块中),但也没有被调用。当我点击一个调用这个的链接时:
<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);
}
(filename.Contains 部分是前任的旧代码,我只需要用 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;
}