我有一个简单的WCF REST方法,它将返回一个字节数组中的图像/文件/ etc:
[OperationContract]
[WebGet(UriTemplate = "TestMethod")]
byte[] TestMethod();
Run Code Online (Sandbox Code Playgroud)
服务契约绑定到a webHttpBinding具有以下行为:
<endpointBehaviors>
<behavior name="webHttpBehavior">
<webHttp defaultOutgoingResponseFormat="Json" />
</behavior>
</endpointBehaviors>
Run Code Online (Sandbox Code Playgroud)
该方法工作正常,除了字节数组的格式如下:
[25,15,23,64,6,5,2,33,12,124,221,42,15,64,142,78,3,23]
Run Code Online (Sandbox Code Playgroud)
如果我删除该属性defaultOutgoingResponseFormat="Json",该服务默认为XML格式,结果在Base64中编码,如:
GQ8XQAYFAiEMfN0qD0COTgMX
Run Code Online (Sandbox Code Playgroud)
这节省了数据传输,特别是在数据变大时.
如何为JSON输出格式启用Base64编码?
san*_*aco 12
几个月前,我遇到了与我们公司的网络服务类似的问题.我必须弄清楚如何使用json端点发送字节数组.不幸的是,没有一个简单的答案.然而我发现了两个工作,我决定选择最简单的工作.我会让你决定其中任何一个是否有用.
选项1返回base64编码的字符串而不是字节数组:
Microsoft的Convert库可以轻松地将字节数组转换为base 64字符串,反之亦然.
[OperationContract]
[WebGet(UriTemplate = "TestMethod")]
string TestMethod();
public string TestMethod()
{
byte[] data = GetData();
return Convert.ToBase64String(data);
}
Run Code Online (Sandbox Code Playgroud)
你的json结果就像......
{
"TestMethodResult":"GQ8XQAYFAiEMfN0qD0COTgMX"
}
Run Code Online (Sandbox Code Playgroud)
然后您的客户端可以将其转换回字节数组.如果客户端也使用C#就像它一样简单
byte[] data = Convert.FromBase64String("GQ8XQAYFAiEMfN0qD0COTgMX");
Run Code Online (Sandbox Code Playgroud)
但是,如果你有一个相当大的字节数组,就像我们的情况一样,以下可能是更好的选择
选项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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16710 次 |
| 最近记录: |