ASP.NET 在 IIS 应用程序池回收或 运行 来自本地主机的网站之前找不到核心 3.1 MVC 下载文件
ASP.NET Core 3.1 MVC download file not found until IIS app pool recycle or run website from localhost
我正在 Microsoft 服务器 运行 IIS 10 上制作一个带有 Entity Framework 网站的 ASP.NET Core 3.1 MVC,具有基本的用户文件上传和下载功能。我可以将文件从网络上传到 _webHostEnvironment.WebRootPath,但是当我尝试下载它们时却找不到它们。但是,如果我回收应用程序池,我可以下载该文件(我也可以在访问服务器本地主机上的网站后从网络上下载它)。
这是我上传文件时的代码:
string uniqueFileName = null;
if (model.Data != null)
{
string uploadsFolder = Path.Combine(_webHostEnvironment.WebRootPath, "images");
uniqueFileName = Guid.NewGuid().ToString() + "_" + model.Data.FileName;
string filePath = Path.Combine(uploadsFolder, uniqueFileName);
model.Data.CopyTo(new FileStream(filePath, FileMode.Create));
}
这是我下载时的代码:
public FileResult DownloadData(string fileName, string tempAddCode, string patientName)
{
byte[] fileBytes = System.IO.File.ReadAllBytes(Path.Combine(_webHostEnvironment.WebRootPath, "images") + "\" + fileName);
var dataStream = new MemoryStream(fileBytes);
return new FileStreamResult(dataStream, new MediaTypeHeaderValue("application/pdf"))
{
FileDownloadName = patientName.ToLower().Replace(" ", "_") + ".pdf"
};
}
这是怎么回事?为什么回收应用程序池可以解决这个问题?我是否将这些用户上传的文件保存到错误的位置并且 ASP.NET 正在执行某种缓存操作?我很乐意帮助您找到解决方案!谢谢
如果在 DownloadData 函数中放置断点并单步执行,会发生什么情况?它是否成功将文件读入 fileBytes,或者您是否遇到异常 - 您遇到了什么异常?还要检查 IIS 日志以获取错误代码,请 post 它。
此外,请确保您 运行 所属的用户对该文件夹具有写入权限。默认情况下,它不会。
要添加,右键单击文件夹,安全,然后添加(从计算机)
IIS AppPool\ [无论应用程序池名称是什么]。
IIS AppPool\MyAppPool
使用这一行,您可以打开文件流并且永远不会关闭它。
model.Data.CopyTo(new FileStream(filePath, FileMode.Create));
确保始终处理流,这样文件就不会保持锁定状态。使用下面的代码将流正确复制到文件
using (var fs = new FileStream(filePath, FileMode.Create))
{
model.Data.CopyTo(fs);
}
我正在 Microsoft 服务器 运行 IIS 10 上制作一个带有 Entity Framework 网站的 ASP.NET Core 3.1 MVC,具有基本的用户文件上传和下载功能。我可以将文件从网络上传到 _webHostEnvironment.WebRootPath,但是当我尝试下载它们时却找不到它们。但是,如果我回收应用程序池,我可以下载该文件(我也可以在访问服务器本地主机上的网站后从网络上下载它)。
这是我上传文件时的代码:
string uniqueFileName = null;
if (model.Data != null)
{
string uploadsFolder = Path.Combine(_webHostEnvironment.WebRootPath, "images");
uniqueFileName = Guid.NewGuid().ToString() + "_" + model.Data.FileName;
string filePath = Path.Combine(uploadsFolder, uniqueFileName);
model.Data.CopyTo(new FileStream(filePath, FileMode.Create));
}
这是我下载时的代码:
public FileResult DownloadData(string fileName, string tempAddCode, string patientName)
{
byte[] fileBytes = System.IO.File.ReadAllBytes(Path.Combine(_webHostEnvironment.WebRootPath, "images") + "\" + fileName);
var dataStream = new MemoryStream(fileBytes);
return new FileStreamResult(dataStream, new MediaTypeHeaderValue("application/pdf"))
{
FileDownloadName = patientName.ToLower().Replace(" ", "_") + ".pdf"
};
}
这是怎么回事?为什么回收应用程序池可以解决这个问题?我是否将这些用户上传的文件保存到错误的位置并且 ASP.NET 正在执行某种缓存操作?我很乐意帮助您找到解决方案!谢谢
如果在 DownloadData 函数中放置断点并单步执行,会发生什么情况?它是否成功将文件读入 fileBytes,或者您是否遇到异常 - 您遇到了什么异常?还要检查 IIS 日志以获取错误代码,请 post 它。
此外,请确保您 运行 所属的用户对该文件夹具有写入权限。默认情况下,它不会。
要添加,右键单击文件夹,安全,然后添加(从计算机) IIS AppPool\ [无论应用程序池名称是什么]。
IIS AppPool\MyAppPool
使用这一行,您可以打开文件流并且永远不会关闭它。
model.Data.CopyTo(new FileStream(filePath, FileMode.Create));
确保始终处理流,这样文件就不会保持锁定状态。使用下面的代码将流正确复制到文件
using (var fs = new FileStream(filePath, FileMode.Create))
{
model.Data.CopyTo(fs);
}