0

我已经实现了一个 VirtualPathProvider 来从 Azure CDN 返回 Azure 网站的主题文件(图像、css)。除了一件事之外,它运行良好:来自 CDN 的文件都将其缓存控制属性设置为“私有”,因此永远不会被缓存。

实际的 blob 的属性设置正确,如果我通过它的直接 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 的文件。他们似乎都使用数据库或只是不同的物理路径。

4

2 回答 2

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");
于 2011-12-14T16:13:04.730 回答
1

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

如果我错了,请纠正我。

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

于 2011-11-22T20:38:57.620 回答