0

Azure 저장소에서 blob을 읽는 코드 (UWP 앱에서)가 있습니다. 연결할 수 있고 컨테이너를 열거하고 BLOB을 찾을 수 있지만 다운로드하려고 할 때 예외가 발생합니다. 지정한 BLOB가 없습니다.지정한 Blob이 존재하지 않습니다. DownloadToStreamAsync를 사용합니다.

Azure 포털을 사용하면 컨테이너를 탐색 할 수 있습니다. 블롭을보고 대화식으로 다운로드 할 수도 있습니다. URL을 확인한 후 일치합니다. 동일한 컨테이너의 다른 폴더에 다른 모양을 넣었으므로 코드가 제대로 다운로드합니다.

블롭은 스트림 애널리틱스 작업을 통해 자동으로 만들어지며 다른 블롭이 생성 된 것과 같습니다.

string csvText = null; 

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CONNECTION_STRING); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    CloudBlobContainer container = blobClient.GetContainerReference(CONTAINER_NAME); 

    OperationContext context = new OperationContext(); 
    BlobRequestOptions options = new BlobRequestOptions(); 

    string prefix = string.Format("{0}/{1:yyyy/MM/dd/HH}", ROOT_FOLDER, SAMPLE_DATE); // ex: telemetry/2016/12/31/22 
    var blobs = await container.ListBlobsSegmentedAsync(prefix, true, BlobListingDetails.All, null, null, options, context); 

    CloudBlockBlob item = blobs.Results.FirstOrDefault() as CloudBlockBlob; //  <<<< I see the blob here. 
    using (var memoryStream = new MemoryStream()) 
    { 
     await item.DownloadToStreamAsync(memoryStream); //  <<<< The specified blob does not exist. 
     csvText = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray()); 
    } 

편집 : 스택 추적은 :

Source Microsoft.WindowsAzure.Storage 
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.<ExecuteAsyncInternal>d__c`1.MoveNext() 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.<>c__DisplayClass11.<<DownloadRangeToStreamAsync>b__10>d__13.MoveNext() 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
at HomeControl.Views.Historical.<LoadData>d__7.MoveNext() 

은 내가 피들러 추적을 얻으려고 노력하지만, UWP 응용 프로그램과 함께 그것을 사용하는 데 문제가 있었다. 이 오류를 해결하는 방법에 대한 제안 사항이 있으십니까?

감사

요한 복음

답변

1

가 발견.

는 BlobListingDetails.All를 전달하여, 내 경우에는 내가 이전에 삭제했던 방울을 포함 커밋되지 않은 모양을 포함 것을 밝혀졌습니다. 내 게시물에서 URL을 일치 언급, 분명히 "_2.csv"를 간과했다, 아마 스트림 작업에 의해. 실제 서버 요청을 보면

, 이것은 다음의 쿼리 문자열에 추가 : 내 FirstOrDefault 가정

&include=snapshots,uncommittedblobs,metadata,copy 

() (이 접두어) 해당 컨테이너에서 최초이자 유일한 결과를 따기되었다, 그러나이 2 개의 얼룩 (blob)이었고 첫 번째는 원래의 삭제 된 (언 커밋 된) 얼룩이었습니다. BlobListingDetails.None를 전달하여

이는 &이 쿼리 문자열을 포함 제거하고, 커밋 모양을 반환합니다.

var blobs = await container.ListBlobsSegmentedAsync(prefix, true, BlobListingDetails.None, null, null, options, context); 
    var item = blobs.Results.OfType<CloudBlockBlob>().FirstOrDefault(); 

요한 복음

P.S. 내 UWP에서 Fiddler를 실행 한 적이 결코 없었습니다. Fiddler에서이 문제를 해결하기 위해 콘솔 애플리케이션으로 이동해야했습니다.