This XML file does not appear to have any style information associated with it. The document tree is shown below.
问题描述
在微软云存储账号的服务中,存储一些静态图片,然后通过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
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!