C# “ASP.NET”;“一次性缓存”;存档
我正在尝试为我的ASP.NET3.5站点中的特定文件实现我称之为“一次性缓存”的功能。根据请求,文件将从远程文件服务器下载到web服务器上,然后由我的页面提供。当我删除它时,问题就出现了。如果我在C# “ASP.NET”;“一次性缓存”;存档,c#,asp.net,download,asp.net-3.5,C#,Asp.net,Download,Asp.net 3.5,我正在尝试为我的ASP.NET3.5站点中的特定文件实现我称之为“一次性缓存”的功能。根据请求,文件将从远程文件服务器下载到web服务器上,然后由我的页面提供。当我删除它时,问题就出现了。如果我在OnUnload方法中删除该文件,客户端将没有时间检索它。是否有某种方法可以检测文件的下载并在首次访问后立即将其删除?我的代码如下: private bool _deleteFlag = false; private string _deleteFile = string.Empty;
OnUnload
方法中删除该文件,客户端将没有时间检索它。是否有某种方法可以检测文件的下载并在首次访问后立即将其删除?我的代码如下:
private bool _deleteFlag = false;
private string _deleteFile = string.Empty;
protected void Page_Load(object sender, EventArgs e) {
if (!string.IsNullOrEmpty(Request.QueryString["file"])) {
_deleteFlag = Request.QueryString["file"].Contains(@"cache/");
_deleteFile = Request.QueryString["file"];
}
}
protected override void OnUnload(EventArgs e) {
if (_deleteFlag) {
// Can't delete here; the client is still trying to retrieve it.
System.IO.File.Delete(Server.MapPath(_deleteFile));
}
base.OnUnload(e);
}
我倾向于编写一个覆盖文件请求的IHttpHandler
,但这感觉有点过头了。试试这个:
添加文件时,将其插入HttpRuntimeCache
并将键设置为FileName
,并将超时设置为10秒。然后在CacheItemRemoved回调上,删除该文件。它并不精确,但应该大致符合您的用例
public static object LoadFile()
{
var filename = ParseFileNameFromHttpRequest();
var a = loadFileSomeHow(filename);
HttpRuntime.Cache.Insert(
filename ,
a,
null,
System.Web.Caching.Cache.NoAbsoluteExpiration,
new TimeSpan(0, 0, 0,10,0,0),
CacheItemPriority.Default,
new CacheItemRemovedCallback(DeleteFile));
return a;
}
public void DeleteFile(String key, object value,
CacheItemRemovedReason removedReason)
{
File.Delete(key);
}
有关更多信息:如果您有权访问IIS,您可以尝试以下[SO链接][1][1]:@karthick,这看起来很有希望。但这会导致IIS删除我的文件,还是我需要自己设计一种机制?这很有效!非常感谢。作为旁注,(至少在我的情况下)没有必要将文件本身放入缓存;我只是把文件名放在键和值字段中,其余的由回调处理。听上去好极了!根据您的平台,如果这是一个有效的用例,您可能需要测试它并确保它在重载下仍能工作。