ActionResultFilter页面未找到错误
本文关键字:错误 ActionResultFilter | 更新日期: 2023-09-27 18:16:58
我正在使用。net mvc开发一个网站。我有一个控制器,我使文件下载到客户端。
[DeleteFileAfterDownloadFilter()]
public FileResult DownloadVersion(int VersionID)
{
//staff to get the tempZipFile
return File(tempZipFile, "zip", "file.zip");
}
我喜欢做的是在下载这个文件后删除这个文件。我想我可以用ActionFilterAttribute
。所以我写了下面的类:
public class DeleteFileAfterDownloadFilter : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
string fileName = ((FileStreamResult)filterContext.Result).FileDownloadName;
File.Delete(fileName);
base.OnResultExecuted(filterContext);
}
}
我想我这里有两个问题。第一个是,当我运行这个东西,它给我的错误".../Company/DownloadVersion?versionID=2057"
页找不到。怎样才能使它起作用呢?
第二个问题是,你可能已经意识到"((FileStreamResult)filterContext.Result).FileDownloadName"
可能不是我想要删除的filePath。它应该是控制器中的"tempZipFile"局部变量。但是我不知道如何将这个值传递给这个事件
我给了你的过滤器一个旋转和(修正后)它产生一个讨厌的COM错误。
这是因为操作的异步性质:OnResultExecuted
是您做某事的最后机会,但是当响应(带有文件名但不是文件本身)被发送回客户端时,就会发生这种情况。当客户端(浏览器)开始下载时,会产生Not Found错误或更严重的错误。
换句话说,你的方法看起来不错,但行不通。
一些粗略的解决方案:
- 确保你的服务器端文件有唯一的名字和可靠的时间戳
- 使用后台进程定期清理它们,或者
- 每次准备新文件时都要清理旧文件
我把你的滤镜改成这样:
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
var r = filterContext.Result as FilePathResult; // not FileContent
string fileName =
filterContext.RequestContext.HttpContext.Server.MapPath(r.FileName);
System.IO.File.Delete(fileName);
}
更新:
由于这个SO的答案,下面应该工作:
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
var r = filterContext.Result as FilePathResult; // not FileContent
string fileName =
filterContext.RequestContext.HttpContext.Server.MapPath(r.FileName);
filterContext.HttpContext.Response.Flush();
filterContext.HttpContext.Response.End();
System.IO.File.Delete(fileName);
}