当文件从VirtualPathProvider作为流返回时,维护文件的缓存控制属性



我已经实现了一个VirtualPathProvider从Azure CDN返回Azure网站的主题文件(图像,css)。除了一件事之外,它工作得很好:来自CDN的文件都将其缓存控制属性设置为"private",因此永远不会缓存。

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

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

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引用文件。他们似乎都在使用数据库,或者只是不同的物理路径。

感谢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");

我想你可能错过了CDN如何获得优势的关键一点。CDN通过将资源放置在更靠近请求文件的客户机的位置来提供帮助。也就是说,当客户端请求文件时,它会直接转到CDN URL。这里发生的事情似乎是你正在从CDN下载文件到运行web服务器的代码,然后从那里将流返回给客户端。

如果我说错了,请纠正我。

同样值得注意的是,缓存属性不是你返回的文件流的一部分,它们是可以在CloudBlob.Properties.CacheControl
中找到的附加属性。

相关内容

  • 没有找到相关文章

最新更新