我有一个简单的WCF REST方法,它将返回一个字节数组中的图像/文件/等:
[OperationContract]
[WebGet(UriTemplate = "TestMethod")]
byte[] TestMethod();
服务合同绑定到webHttpBinding
,行为如下:
<endpointBehaviors>
<behavior name="webHttpBehavior">
<webHttp defaultOutgoingResponseFormat="Json" />
</behavior>
</endpointBehaviors>
该方法工作正常,但字节数组的格式如下:
[25,15,23,64,6,5,2,33,12,124,221,42,15,64,142,78,3,23]
如果删除属性defaultOutgoingResponseFormat="Json"
,则服务默认为XML格式,结果在Base64中编码,如:
GQ8XQAYFAiEMfN0qD0COTgMX
可以节省数据传输,特别是在数据变大时。
如何为JSON输出格式启用Base64编码?
答案 0 :(得分:10)
选项1返回base64编码的字符串而不是字节数组:
Microsoft的Convert库可以轻松地将字节数组转换为base 64字符串,反之亦然。
[OperationContract]
[WebGet(UriTemplate = "TestMethod")]
string TestMethod();
public string TestMethod()
{
byte[] data = GetData();
return Convert.ToBase64String(data);
}
你的json结果就像......
{
"TestMethodResult":"GQ8XQAYFAiEMfN0qD0COTgMX"
}
然后您的客户端可以将其转换回字节数组。如果客户端也使用C#就像
一样简单byte[] data = Convert.FromBase64String("GQ8XQAYFAiEMfN0qD0COTgMX");
如果你有一个相当大的字节数组,但在我们的例子中,以下可能是一个更好的选择
选项2返回一个流:
是的,这意味着你不会得到json。您实际上只是发送原始数据并设置内容标题,以便客户端知道如何解释它。这对我们有用,因为我们只是将图像发送到浏览器。
[OperationContract]
[WebGet(UriTemplate = "TestMethod")]
Stream TestMethod();
public Stream TestMethod()
{
byte[] data = GetData();
MemoryStream stream = new MemoryStream(data);
WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; //or whatever your mime type is
stream.Position = 0;
return stream;
}