从VirtualPathProvider返回为Stream时,在文件上维护缓存控制属性

时间:2011-11-22 08:47:20

标签: caching azure cdn cache-control virtualpathprovider

我已经实现了VirtualPathProvider,以便从Azure CDN返回Azure网站的主题文件(images,css)。除了一件事之外它工作正常:来自CDN的文件都将其缓存控制属性设置为“私有”,因此永远不会缓存。

实际的blob正确设置了它们的属性,如果我通过它的直接URL(即不通过VPP)访问它,那么缓存控制是正确的。

问题似乎是我必须实现的VirtualFile类的Open()方法将文件作为Stream返回?

public override Stream Open()
    {
        CloudBlobClient client = new CloudBlobClient(cdnURL);
        CloudBlob blob = client.GetBlobReference(blobURL);
        blob.FetchAttributes();
        MemoryStream stream = new MemoryStream();
        BlobRequestOptions options = new BlobRequestOptions();
        options.BlobListingDetails = BlobListingDetails.Metadata;
        blob.DownloadToStream(stream,options);
        stream.Seek(0, SeekOrigin.Begin);
        return stream;
    }

搜索这个并且我发现大多数人都有另一种问题 - 即文件在他们不希望的时候被缓存。但是,我找到的所有示例都没有引用其他URL中的文件。他们似乎都使用数据库或只是不同的物理路径。

2 个答案:

答案 0 :(得分:2)

感谢asp.net论坛上的这个答案http://forums.asp.net/post/4716700.aspx

我通过添加Open()方法解决了这个问题:

HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
HttpContext.Current.Response.Cache.AppendCacheExtension("max-age=86400");

答案 1 :(得分:1)

我认为你可能已经错过了CDN如何获得优势的关键点。 CDN通过将资源放在更靠近请求文件的客户端的帮助。即当客户端请求文件时,它直接进入CDN URL。这里似乎发生的是你将文件从CDN下载到运行Web服务器的代码,然后从那里将流返回给客户端。

如果我错了,请纠正我。

还值得注意的是,缓存属性不是您要返回的文件流的一部分,它们是可以在CloudBlob.Properties.CacheControl

中找到的其他属性