Azure文件共享访问签名在结束日期之前过期

Azure文件共享访问签名在结束日期之前过期,azure,azure-functions,azure-storage,Azure,Azure Functions,Azure Storage,我正在使用Azure 12个月试用帐户,并通过Azure门户在存储帐户上托管一个excel文件 我生成一个共享访问签名,结束日期为从今天起三个月,并将生成的SAS令牌粘贴到文件的URL 我可以使用此过程访问该文件。但是,在调用URL后,令牌很快就会过期。最近在Azure存储帐户上使用更新的文件覆盖该文件,然后重新生成SAS令牌之后,发现了此问题 后缀为SAS令牌的URL如下所示: https://xxxxxx.file.core.windows.net/folder_name/yyyyy.xls

我正在使用Azure 12个月试用帐户,并通过Azure门户在存储帐户上托管一个excel文件

我生成一个共享访问签名,结束日期为从今天起三个月,并将生成的SAS令牌粘贴到文件的URL

我可以使用此过程访问该文件。但是,在调用URL后,令牌很快就会过期。最近在Azure存储帐户上使用更新的文件覆盖该文件,然后重新生成SAS令牌之后,发现了此问题

后缀为SAS令牌的URL如下所示:

https://xxxxxx.file.core.windows.net/folder_name/yyyyy.xlsx?sv=2019-02-02&ss=bfqt&srt=sco&sp=rwdlacup&se=2019-12-30T16:04:08Z&st=2019-10-22T08:04:08Z&spr=https,http&sig=xxxxx%yyyyy%zzzz
以下是我看到的错误:

<Error>
<Code>ConditionHeadersNotSupported</Code>
<Message>
Condition headers are not supported. RequestId:<XXXXX> Time:<YYYYYY>
</Message>
</Error>
错误是随机的,URL间歇性工作


有人注意到这个问题了吗?有什么办法可以解决吗?

我可以重现您的错误

这并不意味着SAS令牌已过期。因为如果您测试Azure Blob存储,一切都会正常。错误来自我们正在使用的浏览器。浏览器添加
if条件
标题

当没有
if
标题时,可以正常使用

这是因为文件存储不支持
if
头。并且具有
if
头的请求将不被文件存储接受

这是关于文件存储支持哪种类型的头的问题


因此,这不是SAS token的责任。这是浏览器的问题。如果不是特别的,我建议您使用Azure Blob存储,它不会导致问题。

您遇到的问题是由于Microsoft的Windows Azure文件/1.0 Microsoft HTTPAPI/2.0设置造成的

这项服务主要不是为浏览器访问文件而设计的,它所支持的标题也受到限制

浏览器通常会在尝试下载新副本之前查看文件的本地缓存副本。正如BowmanZhu所说,他们通过检查本地文件属性,并要求web服务器通过使用IF modified Since头,向他们提供文件“IF”,该文件在与缓存相对应的日期之后被修改


服务器没有忽略头,而是抛出了一个错误。要克服这一点,您需要执行页面的硬重新加载。在Chrome中,您可以通过按CTRL+SHIFT+R

来实现这一点,您使用了哪种方法来覆盖它?我手动将更新的文件上载到Azure portal。然后,我从主页>存储帐户>共享访问签名重新生成了SAS令牌。您判断SAS令牌过期的依据是什么?您能否更清楚地描述您的问题,例如提供一些屏幕截图而不泄露隐私?@BowmanZhu Sure。我添加了相关的细节,清除了所有令牌标识符和文件名。问题编辑完成。浏览器添加
标题的行为如果不确定,您可以尝试在新页面中输入完整url或刷新页面。谢谢!我现在明白了为什么不能从浏览器中可靠地获取URL。我使用浏览器作为测试。在我的项目中,我尝试使用System.Net.WebClient的DownloadData()方法在C#中获取文件。我在那里看到了同样的间歇性行为。WebClient.DownloadData()方法中出现错误的根本原因是否相同?如果是,是否有其他方法(如DownloadToStream())可以用于将此文件作为Blob上载?@stackoverflowN是否要从本地文件路径上载文件?@stackoverflowN嗨,看看这个:您需要这个方法吗?谢谢!我试图使用C#WebClient.DownloadData()方法访问该方法,我也看到了其中的间歇性错误。您已经提出了上述问题,以检查这是否是相同的根本原因,以及DownloadToStream()等替代方法是否可以解决此问题?WebClient类使用Internet Explorer缓存。DownloadData()可能可以工作,但除非您无法使用WebClient,否则我将使用HttpRequest类。如果这不能解决它,那么考虑您的基础结构,以及您的存储帐户的路径是否经过代理服务器,代理服务器通常有自己的缓存机制,并且可能插入IF报头。