通过Web API传递字节:为什么这些文件不同?

时间:2014-07-20 11:27:37

标签: c# encoding asp.net-web-api bytearray

我将位图图像存储在Azure blob存储中并将它们传送到.Net Micro Framework设备。由于设备的内存限制,我需要将文件分成块并将它们传送到设备,然后将它们重新组合到设备的microSD卡上。我在使用字节保真度方面遇到了麻烦,并且正在努力理解这种减少测试。

我在azure上有一个简单的位图:https://filebytetest9845.blob.core.windows.net/files/helloworld.bmp它只是“Hello World”字样的黑白位图。

这是我编写的一些测试代码,用于放入ASP .Net Web API并读取准备好分成块的字节。但要测试我只是将字节存储到本地文件。

[Route("api/testbytes/")]
[AcceptVerbs("GET", "POST")]
public void TestBytes()
{
    var url = "https://filebytetest9845.blob.core.windows.net/files/helloworld.bmp";
    var fileRequest = (HttpWebRequest) WebRequest.Create(url);
    var fileResponse = (HttpWebResponse) fileRequest.GetResponse();
    if (fileResponse.StatusCode == HttpStatusCode.OK)
    {
        if (fileResponse.ContentLength > 0)
        {
            var responseStream = fileResponse.GetResponseStream();
            if (responseStream != null)
            {
                var contents = new byte[fileResponse.ContentLength];
                responseStream.Read(contents, 0, (int) fileResponse.ContentLength);
                if (!Directory.Exists(@"C:\Temp\Bytes\")) Directory.CreateDirectory(@"C:\Temp\Bytes\");
                using (var fs = System.IO.File.Create(@"C:\Temp\Bytes\helloworldbytes.bmp"))
                {
                    fs.Write(contents, 0, (int) fileResponse.ContentLength);
                }
            }
        }
    }
}

这是原始位图:

original bitmap

这是保存到磁盘的版本:

saved bitmap

正如您所看到的那样,它们不同,但我的代码应该只保存逐字节副本。他们为什么不同?

2 个答案:

答案 0 :(得分:1)

试试这个

var contents = new byte[fileResponse.ContentLength];
int readed = 0;
while (readed < fileResponse.ContentLength)
{
    readed += responseStream.Read(contents, readed, (int)fileResponse.ContentLength - readed);
}

看起来无法在单Read次通话中下载整个图像,您必须回忆它,直到整个图像都被下载。

答案 1 :(得分:1)

Atomosk是对的 - 单Read次呼叫无法读取整个回复。如果您使用的是.NET 4+,那么您可以使用此代码来读取完整的响应流:

        var fileResponse = (HttpWebResponse)fileRequest.GetResponse();
        if (fileResponse.StatusCode == HttpStatusCode.OK)
        {
            var responseStream = fileResponse.GetResponseStream();
            if (responseStream != null)
            {
                using (var ms = new MemoryStream())
                {
                    responseStream.CopyTo(ms);
                    ms.Position = 0;
                    using (var fs = System.IO.File.Create(@"C:\Temp\Bytes\helloworldbytes.bmp"))
                    {
                        ms.CopyTo(fs);
                    }
                }
            }
        }

使用此代码,您不需要知道内容长度,因为它并不总是可用。