用名称中的括号([&])上载文件
我正在将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