用名称中的括号([&])上载文件

我正在将ClickOnce安装从常规Web服务器移动到Azure Blob存储,并对某些文件存在问题。 文件名包含[ ]并且CloudBlob.UploadFile失败并出现异常:

Microsoft.WindowsAzure.Storageclient.StorageException:
访问blob存储时出错:服务器无法验证请求。 确保授权标头的值正确形成,包括签名。

该代码已被使用了一段时间,只有名称中包含[ ]文件失败,所以我不认为这是“验证失败”。 在这种特殊情况下,这是第七个文件在循环中上传。 我在MSDN上找到了有关有效文件名的链接,这在堆栈溢出时显示,它们都显示URL和方法UrlEncode括号的问题。 我加入了一个UrlEncode调用,并没有帮助。 由于我们使用该容器来支持客户下载我们的软件,因此该容器是通过公共访问创建的。 我们一直在另一个容器中进行“测试”安装,并且没有权限访问该问题。

我可以上传没有更改名称的文件,然后重命名文件以使用newdesic的Azure存储浏览器工具添加“路径”,那么我做的不是这样做的?


我看到你正在使用1.7 SDK。 这是SDK中的一个小编码问题,也存在于v2.0中。 让我们看看发生了什么。

没有编码

account.CreateCloudBlobClient()
       .GetContainerReference("temp")
       .GetBlobReference("abc[]def.txt")
       .UploadFile("myfile.txt");

如果您不对blob名称进行编码,则最终会对请求导致以下URL导致身份验证异常:

http://account.blob.core.windows.net/temp/abc[]def.txt

这是因为SDK Uri.EscapeUriString内部使用Uri.EscapeUriString来对您的字符串进行编码,但这不考虑方括号。

编码

那么你会期望下面的诀窍:

account.CreateCloudBlobClient()
       .GetContainerReference("temp")
       .GetBlobReference(HttpUtility.UrlEncode("abc[]def.txt"))
       .UploadFile("myfile.txt");

这里的问题是,你最终会得到这个网址:

http://account.blob.core.windows.net/temp/abc%255b%255ddef.txt

那么这里发生了什么? 调用HttpUtility.UrlEncode会将abc [] def.txt转换abc%5B%5Ddef.txt ,这是正确的。 但在内部,SDK将再次编码该字符串,导致abc%255b%255ddef.txt ,这不是您想要的。

解决方法

应用将方括号放入帐户的编码的唯一方法是使用小型解决方法。 如果您将完整的URL传递给GetBlobReference方法,则SDK假定您自己完成了所有编码:

var container = account.CreateCloudBlobClient().GetContainerReference("temp");
var blob = container.GetBlobReference(String.Format("{0}/{1}", 
                container.Uri, System.Web.HttpUtility.UrlEncode("abc[]def.txt")));
blob.UploadFile("myfile.txt");

这会导致正确编码的网址:

http://account.blob.core.windows.net/temp/abc%5b%5ddef.txt

如果你使用像CloudXplorer这样的工具,你会看到具有正确文件名的blob:


.Net 4.5中的Uri类有两个已知的休息时间

•'[',']'字符不再逃脱

•''字符现在以%5C格式转义

当服务器尝试验证请求的签名时,这会导致身份验证,因为规范化的字符串现在在客户端和服务器上是不同的。

客户可以在出现此问题时使用几种解决方法。 正确的解决方案将取决于您的具体应用和要求。 避免资源名称中的'[',']'或''字符通过简单地避免这些字符,您将能够避免上述问题。

Target .Net 4.0

目前的建议是,客户只需继续将其应用程序定位到.Net 4.0,同时正在调查一个完整的解决方案。 请注意,由于.Net 4.5是适用的升级版本,客户仍然可以利用GC等方面的一些性能改进,而无需专门针对.Net 4.5配置文件。 对于Windows RT开发人员,这不是一种选择,因此您需要下面详细说明的解决方法。

预转义数据

如果可能的话,客户可以预先避免数据或用不受影响的字符替换给定的字符。 这就是为什么上述解决方法可行。

链接地址: http://www.djcxy.com/p/70165.html

上一篇: Upload File with brackets ([ & ]) in the name

下一篇: Android M email completition