gpt4 book ai didi

【Azure存储服务】访问AzureBlobFile遇见400-ConditionHeadersnotsupport错误的解决之路

转载 作者:我是一只小鸟 更新时间:2023-09-19 23:02:07 27 4
gpt4 key购买 nike

问题描述

在微软云存储账号的服务中,存储一些静态图片,然后通过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存储服务】访问AzureBlobFile遇见400-ConditionHeadersnotsupport错误的解决之路的文章就讲到这里了,如果你想了解更多关于【Azure存储服务】访问AzureBlobFile遇见400-ConditionHeadersnotsupport错误的解决之路的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com