CloudBlob.DownloadText method inserts additional character?

核能气质少年 提交于 2019-12-25 04:58:09

问题


The following unit test fails:

[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 });
        }
    }
}

It turns out, the returned string begins with the dword 0xFEFF (the Unicode BOM). I've traced through the Microsoft debug symbols, and the BOM exists in the return stream. AFAICT, it comes from the HttpResponse.GetResponseStream() method call way down in the Microsoft.WindowsAzure.StorageClient.CloudBlob class.

What's the best way to ensure that the input and output are identical? Ensure the input is converted to Unicode before going in? Strip the BOM from the output? Any other ideas?


回答1:


This is an old one, but if your blob is encoded as Unicode in azure, and you want to download it to a text string, this code will do the trick. Just keep in mind, the weakness here is that you've got to allocate the memory twice. If there's a more efficient way of getting to a Unicode string (synchronously, anyway,) I couldn't find it.

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

    memoryStream.Position = 0;

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


来源:https://stackoverflow.com/questions/11231147/cloudblob-downloadtext-method-inserts-additional-character

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!