azure 更改cdn blob存储中的文件内容后刷新缓存

wljmcqd8  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(132)

有没有办法通过.NET使用CDN更改Azure存储帐户中的缓存控制?
我有一个新的文件上传到blob存储的方法,这个方法也更新同名文件的内容。
问题是,当我更新文件内容时,CDN端点会返回缓存的旧内容。
我的想法是,我设置缓存控制10秒,然后缓存内容刷新与实际内容,但它不工作。
在Azure门户中,我看到设置了缓存控制,但缓存内容不刷新
我该怎么办?谢谢.
我的PanderadFilesAsync方法

public async Task<ImageInfoDto> UploadFilesAsync(string fileName, Stream fileStream, string contentType, bool isUpdated)
    {
        try
        {
            var storageAccount =
                CloudStorageAccount
                    .Parse(_configuration["StorageAccountConnectionString"]);

            var blobClient = storageAccount.CreateCloudBlobClient();

            var container =
                blobClient.GetContainerReference(_configuration["BlobStorageContainerName"]);

            var cdnEndpoint = _configuration["CdnEndpoint"];

            var blob = container.GetBlockBlobReference(fileName);

            using var ms = new MemoryStream();

            fileStream.Position = 0;
            await fileStream.CopyToAsync(ms);
            ms.Position = 0;
            await blob.UploadFromStreamAsync(ms);

            if (isUpdated)
            {
                blob.Properties.CacheControl = "s-maxage=10";
            }

            blob.Properties.ContentType = contentType;

            await blob.SetPropertiesAsync();

            return new ImageInfoDto
            {
                StorageUrl = blob.Uri.ToString(),
                CdnUrl = cdnEndpoint + "/" + container.Name + "/" + fileName,
                ContentType = contentType
            };
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed");
        }
    }
t0ybt7op

t0ybt7op1#

CDN在更新Azure Blob存储中的文件时不刷新缓存内容可能是由于CDN的缓存设置。在blob对象上设置CacheControl属性是正确的,但CDN可能有自己的缓存配置,这会影响行为。
要在更新文件内容时强制CDN刷新其缓存,您可以使用缓存破坏技术。一种常见的方法是在请求文件时将唯一的查询参数附加到URL。这使得CDN将请求视为新请求并获取文件的最新版本。

using System.IO;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

public class ImageService
{
    private readonly IConfiguration _configuration;
    private readonly ILogger<ImageService> _logger;

    public ImageService(IConfiguration configuration, ILogger<ImageService> logger)
    {
        _configuration = configuration;
        _logger = logger;
    }

    public async Task<ImageInfoDto> UploadFileAsync(string localFilePath, string fileName, string contentType, bool isUpdated)
    {
        try
        {
            // Get configuration values
            string? storageConnectionString = _configuration["StorageConnectionString"];
            string? blobContainerName = _configuration["BlobContainerName"];
            string? cdnEndpoint = _configuration["CdnEndpoint"];

            if (string.IsNullOrWhiteSpace(storageConnectionString) || string.IsNullOrWhiteSpace(blobContainerName) || string.IsNullOrWhiteSpace(cdnEndpoint))
            {
                throw new InvalidOperationException("Configuration values are missing or empty.");
            }

            var storageAccount = CloudStorageAccount.Parse(storageConnectionString);
            var blobClient = storageAccount.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference(blobContainerName);

            var blob = container.GetBlockBlobReference(fileName);

            using (var fileStream = File.OpenRead(localFilePath))
            {
                await blob.UploadFromStreamAsync(fileStream);
            }

            if (isUpdated)
            {
                // Append a cache-busting query parameter to the URL
                var uniqueQueryParam = $"cb={Guid.NewGuid()}";
                var cdnUrl = $"{cdnEndpoint}/{container.Name}/{fileName}?{uniqueQueryParam}";
                return new ImageInfoDto
                {
                    StorageUrl = blob.Uri.ToString(),
                    CdnUrl = cdnUrl,
                    ContentType = contentType
                };
            }

            blob.Properties.ContentType = contentType;
            await blob.SetPropertiesAsync();

            return new ImageInfoDto
            {
                StorageUrl = blob.Uri.ToString(),
                CdnUrl = $"{cdnEndpoint}/{container.Name}/{fileName}",
                ContentType = contentType
            };
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Failed");
            throw;
        }
    }

    public class ImageInfoDto
    {
        public string? StorageUrl { get; set; }
        public string? CdnUrl { get; set; }
        public string? ContentType { get; set; }
    }
}

class Program
{
    static async Task Main(string[] args)
    {
        // Configuration values (replace with your actual values)
        string? storageConnectionString = "";
        string? blobContainerName = "";
        string? cdnEndpoint = " ";

        // Create configuration
        var configuration = new ConfigurationBuilder()
            .AddInMemoryCollection(new[]
            {
                new KeyValuePair<string, string?>("StorageConnectionString", storageConnectionString),
                new KeyValuePair<string, string?>("BlobContainerName", blobContainerName),
                new KeyValuePair<string, string?>("CdnEndpoint", cdnEndpoint)
            })
            .Build();

        // Create logger (you can configure it as needed)
        var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.AddConsole();
        });
        var logger = loggerFactory.CreateLogger<ImageService>();

        // Create ImageService with the configuration and logger
        var imageService = new ImageService(configuration, logger);

        // Example usage
        string localFilePath = " ";
        string fileName = "sample1.jpg";
        string contentType = "image/jpeg";
        bool isUpdated = false;

        try
        {
            var imageInfo = await imageService.UploadFileAsync(localFilePath, fileName, contentType, isUpdated);
            Console.WriteLine($"Storage URL: {imageInfo.StorageUrl}");
            Console.WriteLine($"CDN URL: {imageInfo.CdnUrl}");

            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}

输出:

相关问题