2012-06-27 2 views
0

다음 단위 테스트가 실패합니다 : 그것은 밝혀CloudBlob.DownloadText 메서드는 추가 문자를 삽입합니까?

[TestMethod] 
public void Add_file_to_blob_and_retrieve_it() 
{ 
    var blobName = Guid.NewGuid().ToString(); 
    var testFileContents = File.ReadAllText(TestFileSpec); 

    Trace.WriteLine(string.Format("Opening blob container {0}", UnitTestBlobAgentName)); 
    CloudStorageAccount.SetConfigurationSettingPublisher(
      (configName, configSetter) => configSetter(ConfigurationManager.AppSettings[configName])); 
    var cloudStorage = CloudStorageAccount.FromConfigurationSetting("StorageConnectionString"); 
    var blobClient = cloudStorage.CreateCloudBlobClient(); 
    var container = blobClient.GetContainerReference(UnitTestBlobAgentName.ToLower()); 

    try 
    { 
     Trace.WriteLine(string.Format("Uploading file {0}", TestFileSpec)); 
     var blob = container.GetBlobReference(blobName); 
     blob.UploadFile(TestFileSpec); 
     blob.Properties.ContentType = "ByteArray"; 
     blob.SetProperties(); 
     var blob1 = container.GetBlobReference(blobName); 
     var found = blob1.DownloadText(); 
     Assert.AreEqual(testFileContents.Trim(), found.Trim()); 
    } 
    finally 
    { 
     if (null != container) 
     { 
      Trace.WriteLine(string.Format("Deleting blob {0}", blobName)); 
      var blob2 = container.GetBlobReference(blobName); 
      blob2.DeleteIfExists(new BlobRequestOptions { DeleteSnapshotsOption = DeleteSnapshotsOption.IncludeSnapshots }); 
     } 
    } 
} 

, 반환 된 문자열은 DWORD 0xFEFF (유니 코드 BOM)으로 시작한다. Microsoft 디버그 기호를 통해 추적했으며 반환 스트림에 BOM이 있습니다. AFAICT는 Microsoft.WindowsAzure.StorageClient.CloudBlob 클래스의 HttpResponse.GetResponseStream() 메서드 호출 방식에서옵니다.

입출력이 동일하도록하는 가장 좋은 방법은 무엇입니까? 들어가기 전에 입력이 유니 코드로 변환되었는지 확인 하시겠습니까? 출력에서 BOM을 제거 하시겠습니까? 다른 아이디어?

+0

가 궁금()'와'UTF8.GetBytes()'. DownloadByteArray를 호출하는'DownloadStream()'대신'DownloadByteArray()'를 사용해 보았습니다. 그런 다음'Encoding.UTF8.GetString()'...으로 문자열로 인코딩하고 UploadByteArray() 'UploadText()'에 의해 불려진다. –

+0

업로드/다운로드 전에 blob을 인코딩하는 다른 방법을 제안하는 "CopyBlob API의 문자 인코딩 문제"를 확인하셨습니까? http://blogs.msdn.com/b/windowsazurestorage/archive/2012/05/28/character-encoding-issues-related-to-copy-blob-api.aspx – AvkashChauhan

+0

확장 메서드 인'DownloadString'을' CloudBlockBlob'을 호출하고'WebClient.DownloadString'에서 사용되는 것과 동일한 코드를 사용했습니다. 여기에서 코드를 찾을 수 있습니다 : [하늘색에서 텍스트를 다운로드 할 때 BOM 제거 방법] (http://www.reza-aghaei.com/how-to-get-rid-of-bom-when-downloading- text-from-azure-blob /) –

답변

1

이것은 오래되었지만 BLOB가 하늘빛에서 유니 코드로 인코딩되어 있고이를 텍스트 문자열로 다운로드하려는 경우이 코드는 그 트릭을 수행합니다. 명심하십시오. 여기서 약점은 메모리를 두 번 할당해야한다는 것입니다. 더 효율적인 방법으로 유니 코드 문자열을 얻는다면 (동기식으로, 어쨌든), 찾을 수 없습니다. 이 UTF8.GetString`에 관련이있는 경우

string fileText; 
using (var memoryStream = new MemoryStream()) 
{ 
    cloudBlob.DownloadToStream(memoryStream); 

    memoryStream.Position = 0; 

    using (var reader = new StreamReader(memoryStream, Encoding.Unicode)) 
    { 
     fileText = reader.ReadToEnd(); 
    } 
} 
+0

저를 위해 일했습니다 - 고마워요! –