我似乎得到了403:
HTTP/1.1 403 服务器未能验证请求。确保 Authorization 标头的值正确形成,包括签名。
当我HttpWebRequest.DefaultCachingPolicy
在 app.config 中使用如下设置时会发生这种情况:
<system.net>
<requestCaching defaultPolicyLevel="Default" isPrivateCache="false">
<defaultHttpCachePolicy policyLevel="Default"/>
</requestCaching>
</system.net>
我这样做是因为我有一些我无法控制的遗留代码正在调用我提供的 Blob 存储的 API,就好像它是一个文件系统一样(每个文件最多 58 个相同的调用)。显然这并不理想。使用默认的 HTTP 样式缓存是我想要的一种行为,因为它会导致我的应用程序仅在文件被修改时才下载文件。
该问题似乎每隔一个请求就会发生(例如,当请求被缓存并且服务器正在检查服务器内容是否已更改时,它似乎正在发生)。
失败的请求和成功的请求之间的唯一区别似乎是包含:
If-None-Match: "<a blob etag>"
If-Modified-Since: <a date>
我在 github 上查看了 1.7.1 的 .net API(我正在使用)的代码,并假设它没有从 SDK 1.6(我目前使用的)更改,它应该可以正常工作。
非常感谢任何帮助
更新:我写了一些重现代码来帮助:
用途:.NET 4.0、Windows Azure SDK 1.6
using System;
using System.Net;
using System.Net.Cache;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
namespace AzureStorageProb
{
class Program
{
static void Main(string[] args)
{
const string accountKey = "<azure storage account key>";
const string account = "<azure storage account name>";
const string testBlob = "<blob path to test file>";
var cloudStorageAccount =
new CloudStorageAccount(
new StorageCredentialsAccountAndKey(account, accountKey),
useHttps: true);
var cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
HttpWebRequest.DefaultCachePolicy =
new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);
try
{
var blob = cloudBlobClient.GetBlobReference(testBlob);
blob.FetchAttributes();
blob.DownloadByteArray();
Console.WriteLine("First attempt worked!");
}
catch (StorageClientException ex)
{
Console.WriteLine(ex);
}
try
{
var blob = cloudBlobClient.GetBlobReference(testBlob);
blob.FetchAttributes();
blob.DownloadByteArray();
Console.WriteLine("Second attempt worked!");
}
catch (StorageClientException ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
}
}