Azure Web App临时文件清理责任

时间:2015-12-13 03:51:15

标签: azure asp.net-web-api garbage-collection azure-web-sites temporary-files

在我的一个Azure Web App Web API应用程序中,我在Get方法中使用此代码创建临时文件

    string path = Path.GetTempFileName();
    // do some writing on this file. then read 
    var fileStream = File.OpenRead(path);
    // then returning this stream as a HttpResponseMessage response

我的问题是,在这样的托管环境中(不在VM中),我是否需要自己清除这些临时文件? Azure本身不应该清除那些临时文件吗?

3 个答案:

答案 0 :(得分:8)

只有在重新启动网站时才能清除这些文件。

如果您的网站在免费或共享模式下运行,则临时文件只能获得300MB,因此如果您不进行清理,可能会用完。

如果您的网站处于基本模式或标准模式,则会有更多空间(大约200GB!)。所以你可能会在没有达到极限的情况下不清理。最终,您的网站将重新启动(例如在平台升级期间),因此事情将得到清理。

有关此主题的更多详细信息,请参阅this page

答案 1 :(得分:0)

以下示例演示了如何在azure中保存临时文件,包括Path和Bolb。

Doc在这里:https://code.msdn.microsoft.com/How-to-store-temp-files-in-d33bbb10
代码点击此处:https://github.com/Azure-Samples/storage-blob-dotnet-store-temp-files/archive/master.zip

部分是bolb代码的核心逻辑:

private long TotalLimitSizeOfTempFiles = 100 * 1024 * 1024;

private async Task SaveTempFile(string fileName, long contentLenght, Stream inputStream)
{
    try
    {
        await container.CreateIfNotExistsAsync();

        CloudBlockBlob tempFileBlob = container.GetBlockBlobReference(fileName);

        tempFileBlob.DeleteIfExists();

        await CleanStorageIfReachLimit(contentLenght);

        tempFileBlob.UploadFromStream(inputStream);
    }
    catch (Exception ex)
    {
        if (ex.InnerException != null)
        {
            throw ex.InnerException;
        }
        else
        {
            throw ex;
        }
    }
}

private async Task CleanStorageIfReachLimit(long newFileLength)
{
    List<CloudBlob> blobs = container.ListBlobs()
        .OfType<CloudBlob>()
        .OrderBy(m => m.Properties.LastModified)
        .ToList();

    long totalSize = blobs.Sum(m => m.Properties.Length);

    long realLimetSize = TotalLimitSizeOfTempFiles - newFileLength;

    foreach (CloudBlob item in blobs)
    {
        if (totalSize <= realLimetSize)
        {
            break;
        }

        await item.DeleteIfExistsAsync();
        totalSize -= item.Properties.Length;
    }
}

答案 2 :(得分:0)

也许扩展您的FileStream可以覆盖dispose并在调用处置时将其删除吗?这就是我现在要解决的方式。如果我错了,请告诉我。

 /// <summary>
/// Create a temporary file and removes its when the stream is closed.
/// </summary>
internal class TemporaryFileStream : FileStream
{
    public TemporaryFileStream() : base(Path.GetTempFileName(), FileMode.Open)
    {
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        // After the stream is closed, remove the file.
        File.Delete(Name);
    }
}