Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET "one time cache" for file

I'm trying to implement what I'd call a "one time cache" for specific files in my ASP.NET 3.5 site. Upon request, the file is downloaded from a remote file server onto the web server, then served up by my page. The problem arises when I go to delete it. If I delete the file in the OnUnload method, the client doesn't have time to retrieve it. Is there some way of detecting the download of a file and deleting it immediately after it is first accessed? My code is like this:

    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);
    }

I'm leaning towards writing an IHttpHandler that overrides the file request, but that feels like overkill.

like image 586
Stephen Collins Avatar asked Feb 20 '26 23:02

Stephen Collins


1 Answers

Try this:

When you add your file, insert it into the HttpRuntimeCache and set the Key to the FileName and set the TimeOut to say 10 seconds. Then on the CacheItemRemoved callback, delete the file. It's not exact, but it should roughly meet your use case.

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);
}

For more info: http://msdn.microsoft.com/en-us/library/vstudio/7kxdx246(v=vs.100).aspx

like image 138
Philip Pittle Avatar answered Feb 22 '26 13:02

Philip Pittle



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!