在我的一个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本身不应该清除那些临时文件吗?
答案 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);
}
}