在Azure存储Blob中添加Cache-Control和Expires头文件。
在Azure存储Blob中添加Cache-Control和Expires头文件。
我正在使用Azure存储来提供静态文件blob,但我希望在提供文件/ blob时添加Cache-Control和Expires头,以减少带宽成本。
像CloudXplorer和Cerebrata的Cloud Storage Studio这样的应用程序提供了在容器和blob上设置元数据属性的选项,但是当尝试添加Cache-Control时会出现问题。
有人知道是否可以为文件设置这些头部吗?
问题的原因是Azure Storage Blobs在默认情况下不会添加Cache-Control和Expires headers,导致无法在HTTP响应中设置缓存控制。
解决方法是使用Cerebrata Cloud Storage Studio或Azure Explorer来设置每个blob对象的Cache-Control属性。通过右键点击blob对象,选择"View/Edit Blob Properties",然后设置Cache-Control
属性的值。例如:public, max-age=2592000
。
通过curl命令可以检查blob对象的HTTP头,可以看到设置的缓存控制值。
Azure Explorer也提供了相同的功能,并且是免费的,不需要试用。可以在cerebrata.com/products/azure-explorer/introduction中找到更多信息。
问题的原因是需要向Azure Storage Blobs添加Cache-Control和Expires headers,以设置缓存头或其他头字段。解决方法是创建一个临时网站,并使用代码运行WebJobs,通过运行可执行文件来设置缓存头。
具体步骤如下:
1. 在与存储账户位于同一数据中心的地方创建一个临时网站。
2. 使用提供的代码创建一个控制台程序,并编译为发布版。将可执行文件和所有所需的DLL文件压缩为.zip文件,或直接从VisualStudio发布。
3. 创建一个WebJob,并上传第2步中的.zip文件。
4. 运行WebJob,并查看控制台中的输出信息。
5. 删除临时网站或将其更改为免费版。
代码中的示例代码使用Azure.Storage.Blobs.V12和Net 5。它使用Azure.Storage.Blobs库来连接到Azure Storage,并通过循环遍历每个容器来更新Blob的缓存头。
代码中的关键部分是UpdateHeaders和UpdateOneBlob方法。UpdateHeaders方法用于循环遍历每个容器,并在每个容器中调用UpdateOneBlob方法来更新Blob的缓存头。UpdateOneBlob方法使用BlobClient获取Blob的属性,然后使用BlobHttpHeaders类来设置新的缓存控制值,并将其应用于Blob。
通过运行WebJob,可以在控制台中查看输出,并在WebJob控制页面上查看生成的日志文件。
这是一个简单的解决方法,可以在Azure Storage Blobs中添加Cache-Control和Expires headers来设置缓存头。这可以提高性能和响应时间,并减少网络传输。
问题的出现原因:
- 作者需要在大约600k个blob上运行批处理作业。
- 作者发现两个因素对提高效率非常有帮助:
- 在相同数据中心的工作角色中运行操作。只要它们在同一个亲和组中,Azure服务之间的速度很快,而且没有数据传输费用。
- 并行运行操作。.NET v4中的任务并行库(TPL)使此操作非常简单。
解决方法:
- 使用以下代码为容器中的每个blob设置缓存控制头:
// 获取容器中每个blob的信息 var blobInfos = cloudBlobContainer.ListBlobs( new BlobRequestOptions() { UseFlatBlobListing = true }); Parallel.ForEach(blobInfos, (blobInfo) => { // 获取blob属性 CloudBlob blob = container.GetBlobReference(blobInfo.Uri.ToString()); blob.FetchAttributes(); // 如果需要,设置缓存控制头 if (blob.Properties.CacheControl != YOUR_CACHE_CONTROL_HEADER) { blob.Properties.CacheControl = YOUR_CACHE_CONTROL_HEADER; blob.SetProperties(); } });
其他信息:
- 不能再将完整的URI传递给GetBlobReference。作者用一些最新的代码编辑了答案,以便在其中一个容器中执行此操作。
- 有人可能编写了一个实用程序来执行此操作,考虑到人们经常需要这样做。
- 作者在相同容器中对大约200,000个blob运行了脚本,并收到了409服务器响应。作者想知道这是什么意思。
- 某些情况下Azure SDK for Java的用法与此非常相似。