0

使用 Microsoft.WindowsAzure.Storage 2.1.0.3

尝试编写控制台应用程序以将文档从一个 Azure 存储帐户移动到另一个帐户。该应用程序使用 sourceClient.ListContainers() 列出所有容器,遍历 foreach 块中的所有容器,为每个容器获取共享访问令牌,然后为每个 blob 触发 StartCopyFromBlob 请求。目标 blob 具有相同的命名结构,但位于不同的帐户中(例如 sourceAzureUrl/testContainer/filename.ext -> destAzureUrl/testContainer/filename.ext)。

大多数文件 (98%) 复制得很好,但是当发送某些请求时,它会返回以下异常:“远程服务器返回错误:(403) Forbidden。” 创建对目标 blob 的 CloudBlockBlob 引用时,该 URL 似乎没有正确地进行 URL 转义,从而导致异常。但是,当此代码在 MVC 控制器内部运行时,请求会以某种方式正确地进行 URL 转义,并且请求会在没有错误的情况下完成。复制的 blob 也包含未转义的名称。

原因似乎是 blob/文件名包含“[”和/或“]”字符(例如 Roger_Smith[1].doc)。如果文件名预先进行了 URL 编码,则请求完成且没有错误,但 Azure 存储中的文件名是其 URL 转义的化身,而不是原始文件名(Roger_Smith%255b1%255d.doc 而不是 Roger_Smith[1].doc)。

有没有办法正确地对复制请求进行 URL 转义,并且结果 blob 仍然具有未转义的名称?

4

1 回答 1

0

您能否确认您正在使用 .net 4.5 运行?您提到的在 .net 4.5 中引入的字符(括号)存在 uri 转义问题,与 .net 4.0 不兼容(这是服务用于验证响应的内容)。因此,似乎消息签名的格式不正确。我们正在与 .net 团队合作解决这个问题的长期解决方案。同时,您可以考虑在 .net 4.0 下运行(安装 .net 4.5 以利用 GC 改进)或避免文件名中的括号字符。

于 2013-11-16T00:16:56.943 回答