- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我似乎收到了 403:
HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
当我在 app.config 中设置 HttpWebRequest.DefaultCachingPolicy
时,会发生这种情况,如下所示:
<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();
}
}
}
最佳答案
原来罪魁祸首是 BlobRequest.SignRequest(request, creds);
快速浏览一下文档表明 If-None-Match
和 If-Modified-Since
都用作调用添加的身份验证 header 的计算的一部分。因为这些 header 是在 WINInet 计算身份验证 header 之后添加的(假设)。无论哪种方式,最终结果都是身份验证 header 提供的校验和现在无效。从而导致 403 Forbidden
。
解决方法:
我不会说 Azure Blob 存储已损坏...但我会说它不是真正的 RESTful,因为它无法正确遵守 HTTP 语义。
关于.net - System.Net.Caching.HttpRequestCachePolicy 和 CloudBlob.FetchAttributes 之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13369660/
这个问题已经有答案了: Differences between Azure Block Blob and Page Blob? (6 个回答) 已关闭 1 年前。 看起来像CloudBlob有 3 个
我使用 SQL Azure 来存储 Blob 元数据,并使用 Azure Blob 存储来存储实际的 Blob。 Blob 创建/删除是通过在环境 TransactionScope 中登记这些操作来实
任务 使用原始文件名将文件上传到 Azure Blob Storage,并将文件名作为 meta-data 分配给 CloudBlob 问题 元数据中不允许使用这些字符,但可以接受作为blob名称:
以下单元测试失败: [TestMethod] public void Add_file_to_blob_and_retrieve_it() { var blobName = Guid.NewG
使用 Windows Azure 存储客户端库,CloudBlob.OpenRead() 方法仅读取 4 mb 的数据。如何使用 OpenRead 方法读取完整流。 CloudBlob blob =
使用 Windows Azure 存储客户端库,CloudBlob.OpenRead() 方法仅读取 4 mb 的数据。如何使用 OpenRead 方法读取完整流。 CloudBlob blob =
我想将用户上传到我的网站的文件保存到我的 Azure Blob 中,并且我正在使用 CloudBlob.UploadFromStream 方法来执行此操作,但我想确保在做更多工作之前文件已顺利完成保存
我正在尝试从我的 Azure 存储帐户下载二进制文件。最初,我使用 CloudBlob.DownloadToFileAsync(),它允许我提供 IProgress 参数并获取传输进度更新。 但是,在
我一定在这里遗漏了一些明显的东西,但我发现自己无法进行我认为合法的向上转换。我正在尝试将数据上传到 Azure 中的 Blob 存储,并且想使用方法 CloudBlob.UploadText(stri
我正在尝试通过流从 cloudBlob 下载文件。我引用这篇文章CloudBlob 这是下载 blob 的代码 public Stream DownloadBlobAsStream(CloudStor
编辑:扩展代码示例以显示如何加载 destinationBlob。 我们正在利用直接帐户到帐户复制来传输一组 blob。由于属性在进程启动时会被覆盖,因此我们会定期监视目标 blob,然后在复制完成时
编辑:扩展代码示例以显示如何加载 destinationBlob。 我们正在利用直接帐户到帐户复制来传输一组 blob。由于属性在进程启动时会被覆盖,因此我们会定期监视目标 blob,然后在复制完成时
几个小时以来,我一直在尝试在使用 Azure SDK 创建的 blob 上设置一些元数据。我使用 BeginUploadFromStream() 异步上传数据,一切顺利。上传完成后,我可以使用 Blo
我正在尝试获取有关 Azure blob(上次修改的 UTC 日期时间)的一些信息。此信息存储在 CloudBlob.Properties.LastModifiedUtc 属性中。 如果我使用方法 G
我有以下代码,该代码使用已弃用的 Microsoft.WindowsAzure.StorageClient 并已升级到 Microsoft.WindowsAzure.Storage,现在我无法使用下面
我很确定这是 Windows Azure SDK 的限制(使用最新的 1.4),但必须有一种方法可以解决这个问题,而无需使用手动 REST... 代码: CloudBlob blob = contai
所以我一直在浏览https://learn.microsoft.com/en-us/learn/modules/copy-blobs-from-command-line-and-code/7-move
我想创建端点来传输存储在 azure CloudBlob 中的视频流。这是我的代码片段: public async Task GetVideo(string videoId) {
我似乎收到了 403: HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authoriza
我似乎收到了 403: HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authoriza
我是一名优秀的程序员,十分优秀!