如何使用JSON从WCF REST服务返回Base64编码的字节数组?

我有一个简单的WCF REST方法,它将返回一个字节数组中的图像/文件/ etc:

[OperationContract] [WebGet(UriTemplate = "TestMethod")] byte[] TestMethod(); 

服务契约绑定到webHttpBinding具有以下行为:

      

该方法工作正常,除了字节数组的格式如下:

 [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编码?

几个月前,我遇到了与公司网络服务类似的问题。 我必须弄清楚如何使用json端点发送字节数组。 不幸的是,没有一个简单的答案。 然而,我找到了两个工作,我决定选择最简单的工作。 我会让你决定其中任何一个是否有用。

选项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; }