如何通过WEB API返回具有字节数组属性的对象?

3

我正在编写一个Web API,返回一个带有字节数组属性的对象,在控制器中类似于这样:

...
car.name=Cruze;
car.Image=[123,145,10,...] // image data as byte[]

return Ok(car);

在用户界面上,我可以看到返回的汽车对象,但是car.Image属性被转换为Base64String。我不确定为什么会发生这种情况。如何确保将car.Image作为byte[]发送到客户端?谢谢任何帮助!
2个回答

6

Web API通信是通过HTTP进行的。HTTP不知道任何关于byte[]的信息。因为你的byte[]是C#的一部分,而HTTP也不知道任何关于C#的信息。

所以它被正确地序列化为Base64String(这确实是最好的做法),你的客户端需要将Base64解码为字节数组以进行进一步处理。


2

您的服务器和客户端之间的所有通信都必须进行序列化。所以在其他所有内容中,您的字节数组将被序列化。在这种情况下使用的标准序列化是 Base64String

实际上,如果您想在网站上使用您的图像,则Base64String 只是让这变得更简单。您只需在字符串开头添加 data:image/jpeg;base64, 并在您通常使用图像URL的任何位置使用它。将 jpeg 更改为您的图像类型。例如:

HTML:

<img src="data:image/jpeg;base64,..." />

JavaScript:

img.src = "data:image/jpeg;base64,...";

CSS(层叠样式表):
URL("data:image/jpeg;base64,...")

如果您想使用HTML5的功能编辑图像,也可以将其加载到画布中。

如果您使用的是浏览器以外的客户端,现在有越来越多的库可以在任何编程框架中转换Base64String和图像,所以只需为您的框架寻找一个即可。

如果您想将字节数组用于其他用途,可以轻松地将Base64String解码回字节数组。


非常感谢您的回答,Racil。Base64String会将初始数组增加约33%的字节,这会增加流量的负载。由于我们需要通过API发送大量图像,如果API只能发送纯byte[]并且我们可以在客户端上进行转换,那么效果会更好。这也会减轻API服务器的工作负担。 - Charlie
你正在计算33%,但没有考虑到压缩。你的API和客户端之间的所有流量都经过压缩,因此实际上比33%要少得多,甚至可能更小。在浏览器中测试您的API以查看实际压缩大小。这里是如何在Chrome中检查它的方法 - Racil Hilan
1
只是为了明确,服务器和客户端之间发送的所有内容都是序列化的。因此,如果您不喜欢字节数组的默认Base64String序列化方式,则可以手动以任何您想要的方式进行序列化。然后,您会意识到很难超越Base64String序列化的效率。您说它增加了33%,试着超越它。这是标准二进制序列化的原因。 - Racil Hilan
非常感谢您的回复,我会接受的。 :) - Charlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接