Azure存储容器ListBlobs在升级存储到4.0.1后抛出Uri NULL异常

时间:2014-12-02 18:16:55

标签: c# azure azure-storage

当我将azure存储从1.8升级到4.0.1时,以下代码不再起作用。

var myUri = new Uri(generatedURLwithSAS);
var sasContainer = new CloudBlobContainer(myUri);
var result0 = sasContainer.ListBlobs();
Console.WriteLine(result0);

对于存储4.0.1,代码抛出异常:

Exception Type: Microsoft.WindowsAzure.Storage.StorageException
Exception: Value cannot be null.
Parameter name: uriString
Stack Trace: 
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd,     IRetryPolicy policy, OperationContext operationContext)
at Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.<>c__DisplayClassf.<ListBlobs>b__e(IContinuationToken token)at Microsoft.WindowsAzure.Storage.Core.Util.CommonUtility.<LazyEnumerable>d__0`1.MoveNext()

Exception Type: System.ArgumentNullException
Exception: Value cannot be null.
Parameter name: uriString
Stack Trace: 
at System.Uri..ctor(String uriString)
at Microsoft.WindowsAzure.Storage.Blob.Protocol.ListBlobsResponse.<ParseXml>d__0.MoveNext()
at Microsoft.WindowsAzure.Storage.Shared.Protocol.ResponseParsingBase`1.<ParseXmlAndClose>d__6.MoveNext()
at Microsoft.WindowsAzure.Storage.Shared.Protocol.ResponseParsingBase`1.<get_ObjectsToParse>d__0.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.<ListBlobsImpl>b__4a(RESTCommand`1 cmd, HttpWebResponse resp, OperationContext ctx)
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ProcessEndOfRequest[T](ExecutionState`1 executionState)
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)

知道如何让它运作?

我知道我可以使用account和accountkey来创建访问容器和列表blob的凭据,但我想知道如何只使用SAS的blob路径。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

您在下面提供的SAS令牌是使用旧版本的Storage Client Library生成的。客户端库只能与一个版本的REST协议通信。使用旧客户端生成的SAS令牌为操作强制执行旧的REST版本服务端,但新客户端使用2014 REST版本语义来解释响应。 这打破了,因为这些REST版本之间的ListBlobs XML响应发生了重大变化,因此新的客户端库无法正确解析该XML。

以下是有关SAS令牌的一些可能有用的更改的更多信息,包括api-version参数:http://blogs.msdn.com/b/windowsazurestorage/archive/2014/05/14/what-s-new-for-microsoft-azure-storage-at-teched-2014.aspx

请尝试使用客户端库4.0.1版重新生成令牌,并且您的代码应按预期工作。