ASP.NET MVC:FileStreamResult返回太多字节?

时间:2011-03-11 19:50:46

标签: asp.net-mvc filestream

我正在调用MVC控制器方法。 返回类型是FileStreamResult。 在这个方法中,我正在以字节数组的形式创建一个图像。 我正在创建一个MemoryStream,在构造函数中传递byte数组。 然后我在构造函数中返回一个带有内存流对象和“image / png”的新FileStreamResult对象,因为我的图像是PNG。

public FileStreamResult GetImage()
    {
        ImageModel im = new ImageModel();
        var image = im.GetImageInByteArray();
        var stream = new MemoryStream(image);
        return new FileStreamResult(stream, "image/png");
    }

现在,当我从此调用中获取请求流时,我只是使用以下方法将流字符串转换为字节数组以查看图像。 但是,在完成所有操作之后,我的字节数组中的位置比从MVC控制器方法调用返回的位置多100个。

public static byte[] ConvertStringToBytes(string input)
    {
           MemoryStream stream = new MemoryStream();

           using (StreamWriter writer = new StreamWriter(stream))
           {
             writer.Write(input);
             writer.Flush();
           }

         return stream.ToArray();
   }

例如,在“GetImageInByteArray()”调用之后,我有“byte [256]”。 但是当它从MVC调用返回并通过将其放入第二种方法转换响应字符串时,我最终得到“byte [398]”;

编辑问题 我正在对GetImage()控制器方法进行的Web请求和我假设接收的内容之间是否存在某种划分?

我假设我从该调用中收到的是图像字节数组的内存流。 这就是为什么我只是将它转换回字节数组。

我的假设在这里错了吗?

3 个答案:

答案 0 :(得分:2)

当MVC操作返回结果时,它会通过ASP.NET管道,该管道在HTTP标头上进行处理,以便请求者(浏览器)可以理解如何处理响应。

对于图像,这些标题可能包括:

Response Code
Content-Length
Content-Type

或任何其他数量的自定义或典型HTTP标头(Some more HTTP Headers)。

如果我正确理解了您的问题,您将整个响应从您的操作转换为字节,那么您自然也会转换标头以及请求可能返回的任何其他内容(Cookie?)。

您希望通过反序列化请求来完成什么?你想尝试一下吗?

答案 1 :(得分:0)

你的字符串是如何编码的?在我看来,这是编码的问题。

尝试使用此方法代码:

return (new System.Text.UTF8Encoding()).GetBytes(input);

问候

答案 2 :(得分:0)

我真的很感谢你对Dawid的帮助,但我决定采取另一种方式。 我创建了一个传输对象来简单地将字节数组作为属性。 我将其序列化,然后传递对象,在另一端反序列化,我的字节数组就是这样。

我仍然对HTTP请求正在传递到正在传递的内存流上的内容感到困惑,但我只是走了另一条路。