C# “ASP.NET”;“一次性缓存”;存档

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;

我正在尝试为我的ASP.NET3.5站点中的特定文件实现我称之为“一次性缓存”的功能。根据请求,文件将从远程文件服务器下载到web服务器上,然后由我的页面提供。当我删除它时,问题就出现了。如果我在
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删除我的文件,还是我需要自己设计一种机制?这很有效!非常感谢。作为旁注,(至少在我的情况下)没有必要将文件本身放入缓存;我只是把文件名放在键和值字段中,其余的由回调处理。听上去好极了!根据您的平台,如果这是一个有效的用例,您可能需要测试它并确保它在重载下仍能工作。