我已经实现了一个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