2014-12-02 75 views
0

当我将Azure存储从1.8升级到4.0.1时,以下代码不再有效。将存储升级到4.0.1后,Azure存储容器ListBlobs抛出Uri NULL异常

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) 

如何得到它的工作任何想法?

我知道我可以使用帐户和accountkey来创建凭据来访问容器和列表blob,但我想知道如何做到这一点只与SAS的blob路径。

任何建议将不胜感激。

回答

2

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

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

请尝试与客户端库的版本4.0.1和你的代码再生令牌应该按预期工作。