【Azure 存储服务】访问Azure Blob File遇见400-Condition Headers not support错误的解决之路
问题描述
在微软云存储账号的服务中,存储一些静态图片,然后通过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。
经验证,这种方法是可行的。
但问题在于,这个方法也只能使用一次。
第二次刷新时(如果随即参数不变化),也会遇见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
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-09-19 【Azure 事件中心】Flink消费Event Hub中事件, 使用Azure默认示例代码,始终获取新产生的事件,如何消费旧事件呢?
2021-09-19 【Azure 应用服务】App Service 进入后台管理(Kudu)页面,因为文件过多而显示不全的问题
2021-09-19 【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token