Azure存储副本Blob控制台应用程序 - 403禁止错误

时间:2013-11-05 01:07:53

标签: console-application azure-storage urlencode http-status-code-403

使用Microsoft.WindowsAzure.Storage 2.1.0.3

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

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

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

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

1 个答案:

答案 0 :(得分:0)

你能确认你在运行.net 4.5吗?在.net 4.5中引入的字符(括号)有一个uri转义问题,它与.net 4.0不兼容(这是服务用于验证响应的内容)。因此,看起来好像消息签名不正确。我们正在与.net团队合作,为此长期解决问题。在此期间,您可以考虑在.net 4.0下运行(安装.net 4.5以利用GC改进)或避免文件名中的括号字符。