我已经实现了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中的文件。他们似乎都使用数据库或只是不同的物理路径。
答案 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