【Azure 存储服务】访问Azure Blob File遇见400-Condition Headers not support错误的解决之路

Azure ,support,Blob File,存储 · 浏览次数 : 30

小编点评

问题是微软云存储账号服务在存储静态图片后通过 App Service访问时遇到 400 - condition headers not support 错误。该错误源于存储账户不支持条件标头。 **解决方案:** 1. 在上传文件时设置 `CacheControl` 属性值为 `no-cache, no-store, must-revalidate`。 2. 在每次请求文件时增加一个随机参数,以确保每次发出的请求URL不一样。 3. 在 Azure Blob File Share 文件中设置 `CacheControl` 属性值为 `no-cache, no-store, must-revalidate`。 4. 在文件上传时使用 PowerShell脚本批量修改文件的 `CacheControl` 属性。 **代码示例:** ```powershell # Set Storage Account name, File Share Name, and Account Key $account_name = "您的存储账号名称" $account_key = "您的存储账号密钥" $file_share_name = "需要修改的文件夹名称" # Update all file properties UpdateAllFileProperties -FolderName $file_share_name # Recursive function to list files and update properties Function UpdateAllFileProperties { param($folderName) Write-Host "Start to list this folder - $folderName" # List all files and folders under this input folder path $subfiles = az storage file list -s $folderName --account-name $account_name --account-key $account_key | ConvertFrom-Json # Loop through files and update properties foreach ($f in $subfiles) { if ($f.type -eq 'file') { Write-Host "\t" + $f.name # Update file properties with CacheControl directive az storage file update -p $f.name -s $folderName --account-name $account_name --account-key $account_key --content-cache "no-cache, no-store, must-revalidate" } elseif ($f.type -eq 'dir') { $newfolder = $folderName + '/' + $f.name Write-Host $newfolder UpdateAllFileProperties $newfolder } else { Write-Host "Invalid type, coutinue ... " } } Write-Host "Start ... " } ```

正文

问题描述

在微软云存储账号的服务中,存储一些静态图片,然后通过App Service访问,但是遇见了400 - condition headers not support 错误。

在单独通过浏览器访问 File Share中的文件,发现第一次可以请求成功,但是第二次刷新后就遇见400错误,第三次刷新的时候又访问成功,如此循环下去。

错误消息为:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error> <Code>ConditionHeadersNotSupported</Code> <Message>Condition headers are not supported. RequestId:cf7f3c6e-101a-0052-73db-ea03cf000000 Time:2023-09-19T09:24:55.3527405Z</Message> </Error>

 

问题解答

在网络上搜索关键字 “400 Condition headers are not supported. “, 就可以发现很多结果。

其中以 Github的结果(https://github.com/MicrosoftDocs/azure-docs/blob/main/includes/storage-files-condition-headers.md) 和 Stack Overflow (https://stackoverflow.com/questions/43706605/azure-file-storage-error-condition-headers-are-not-supported) 为参考,找到了问题的根源

 

根源

Conditional headers aren't currently supported. Applications implementing them will need to request the full file every time the file is accessed.
Storage Account 目前不支持条件标头。 实现它们的应用程序将需要在每次访问文件时请求完整的文件。

文章中也给出了解决方案,通过在上传的文件中设置 CacheContorl属性值为 no-cache, no-store, must-revalidate. 目的时告诉浏览器,不要对这个URL的内容进行缓存,必须从源站点重新验证获取最新资源。

  • 所以需要通过 Azure Storage Explorer工具对每一个文件(注意:不能对文件所属的文件夹进行修改)的属性值 【CacheControl】进行修改。

  •  在Stack Overflow中,提出了另一种解决办法,就是在每一次请求的URL后面,增加一个随机参数,以保证每次发出的请求URL不一样,避免了浏览器缓存,因此也不会添加 Conditional Header。

(Source:https://stackoverflow.com/questions/43706605/azure-file-storage-error-condition-headers-are-not-supported


经验证,这种方法是可行的。

但问题在于,这个方法也只能使用一次。

第二次刷新时(如果随即参数不变化),也会遇见400-condition headers not support报错。

 

所以最后,最好的解决办法还是在Azure Blob File Share的文件中,添加属性值 CacheContorl为 no-cache, no-store, must-revalidate。

  • 如果是新文件,可以在上传的方法中设置CacheControl Properties 。
  • 如果是已经存在的文件,可以通过PowerShell脚本批量修改文件的 CacheControl Properties, 主要是使用

1) 获取指定folder下的全部内容 az storage file list
2) Foreach 循环,如果遇见文件夹,使用递归调用,直至全部文件获取完毕
3) 对文件类型,使用 az storage file update 更改 --content-cache 值

PowerShell脚本示例如下:

## Set the Storage Account name, File Share Name, and the Acceount Key
$account_name = "您的存储账号名称"
$account_key = "您的存储账号密钥"
$file_share_name = "需要修改的文件夹名称" #会修改文件夹中所有文件的content-cache属性值为 "no-cache, no-store, must-revalidate"

## Recursive Call to list all files and update the file properties .
Function UpdateAllFileProperties {
    param($foldername)
    Write-Host "Start to list this folder - "  $foldername
    #List all file & folder under this input folder path...
    $subfiles = az storage file list -s $foldername --account-name $account_name --account-key $account_key |  ConvertFrom-Json
    Foreach ($f in $subfiles) {
    
        If ($f.type -eq 'file') {
            Write-Host "\t" + $f.name 
            #Update file properties  --content-cache "no-cache, no-store, must-revalidate"
            az storage file update -p $f.name -s $foldername --account-name $account_name --account-key $account_key --content-cache "no-cache, no-store, must-revalidate"
        }
        elseif ($f.type -eq 'dir') {
            $newfolder = $foldername + '/' + $f.name
            Write-Host $newfolder          
            UpdateAllFileProperties $newfolder
        }
        else {
            Write-Host "Invalid type, coutinue ... "
        }    
    }
}

Write-Host "Start ... "
#Start to foreach all files & folders
UpdateAllFileProperties  $file_share_name
Write-Host "Complete ... "

 

执行结果展示动画:

 

 

参考资料

Error ConditionHeadersNotSupported from a Web Application using Azure Files from Browser : https://github.com/MicrosoftDocs/azure-docs/blob/main/includes/storage-files-condition-headers.md

Azure File Storage Error: Condition Headers Are Not Supported : https://stackoverflow.com/questions/43706605/azure-file-storage-error-condition-headers-are-not-supported

az storage file : https://learn.microsoft.com/en-us/cli/azure/storage/file?view=azure-cli-latest#az-storage-file-list()

Cache-Control : https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control

 
 

 

与【Azure 存储服务】访问Azure Blob File遇见400-Condition Headers not support错误的解决之路相似的内容:

【Azure 存储服务】访问Azure Blob File遇见400-Condition Headers not support错误的解决之路

This XML file does not appear to have any style information associated with it. The document tree is shown below.

【Azure 应用服务】Function App / App Service 连接 Blob 报错

问题描述 因 Blob 启用了防火墙功能,但是当把App Service 或 Function App的出站IP地址都加入到Blob的白名单中,为什么访问还是403错误呢? 问题解答 Azure Storage的IP网络规则不适用于同一数据中心的客户端。 存储帐户部署在同一区域中的服务使用专用的 A

【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account

问题描述 在Azure的同一数据中心,API Management访问启用了防火墙的Storage Account,并且把APIM的公网IP地址设置在白名单。但访问依旧是403 原因是: 存储帐户部署在同一区域中的服务使用专用的 Azure IP 地址进行通信。 因此,不能基于特定的 Azure 服

【Azure 存储服务】存储在Azure Storage Table中的数据,如何按照条件进行删除呢?

问题描述 如何按条件删除 Storage Table 中的数据,如果Table中有大量的条记录需要删除,Java代码如何按条件删除 Table中的数据(Entity)? (通过Azure Storage Explorer工具是可以删除,但是由于数据量太大,人工操作耗时太久,所以需要使用Java代码完

【Azure 存储服务】Azure Blob Storage SDK 升级失败,遇见 Unsatisfied Dependency Exception 和 Unexpected Length Exception

问题描述 在升级Java Azure Blob Storage SDK的过程中,先后遇见了 UnsatisfiedDependencyException 和 UnexpectedLengthException. 错误一:Org.springframework.beans.factory Unsati

【Azure 存储服务】多设备并发往 Azure Storage Blob 的 Container 存数据是否可以

问题描述 多设备并发往 Azure Storage Blob 的 Container 存数据是否可以? 问题解答 可以! Azure Storage 是支持的并发存储数据的,Blob 可以使用乐观并发或悲观并发模型的,具体实现可以参考文档:https://docs.microsoft.com/zh-

【Azure 存储服务】Azure Data Lake Storage (ADLS) Gen2 GRS Failover是否支持自动切换或者手动切换到灾备的终结点呢?

问题描述 在Azure的存储服务中,介绍灾备恢复和Storage Account故障转移的文档中,有一句话“Account failover is not supported for storage accounts with a hierarchical namespace enabled.” 而

【Azure 存储服务】如何查看Storage Account的删除记录,有没有接口可以下载近1天删除的Blob文件信息呢?

问题描述 如何查看Storage Account的删除记录,有没有接口可以下载近1天删除的Blob文件信息呢?因为有时候出现误操作删除了某些Blob文件,想通过查看删除日志来定位被删除的文件信息。 问题解答 如果没有启用Storage Account的软删除功能,则没有办法直接查看近期有删除的Blo

【Azure 存储服务】MP4视频放在Azure的Blob里面,用生成URL在浏览器中打开之后,视频可以正常播放却无法拖拽视频的进度

问题描述 把MP4视频放在Azure的Blob里面,用生成URL在浏览器中打开之后,视频可以正常播放却无法拖拽视频的进度,这是什么情况呢? 问题解答 因为MP4上传到Azure Blob后,根据公开的权限,可以直接通过Storage Blob URL +/ Blob Container + / Bl

【Azure 存储服务】Azure Storage Account Queue中因数据格式无法处理而在一个小时内不在可见的问题

问题描述 在从Storage Account 队列中获取数据(Queue),在门户中,明显看见有数据,但是通过消费端代码去获取的时候,就是无法获取到有效数据的情况。获取消息的代码如下: 问题解答 经过对 receiveMessages 方法定义的查询,第二个参数,第三个参数的两个时间表示的意思为 消