我正在调用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请求和我假设接收的内容之间是否存在某种划分?
我假设我从该调用中收到的是图像字节数组的内存流。 这就是为什么我只是将它转换回字节数组。
我的假设在这里错了吗?
答案 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请求正在传递到正在传递的内存流上的内容感到困惑,但我只是走了另一条路。