Restful服务Raw格式返回问题
此处省略对Restful服务的阐述,直接进入问题:
最近在做一个共享服务系统,前端采用的是Javascript,后台服务就跳过了SOAP和RPC等的考虑,开始接触以Restful风格来编写后台服务,对于返回Json格式或xml格式的数据,期间已遇到了一些问题,不过都是些格式转换的问题。但是最近在返回图片或文件数据流的时候就出现了让人头疼的问题,毕竟对该服务了解不多,以下把我遇到的问题与大家分享下:
1.服务端代码:
服务接口:
[ServiceContract]
public interface ICodeService
{
[WebGet(UriTemplate = "")]
Stream GetCheckCodeImage();
}
服务实现代码:
Stream ICodeService.GetCheckCodeImage()
{
string code = null;
WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpg";
Stream imgStream = CodeRepository.GetCheckCodeStream(out code);
return imgStream;
}
2.服务端发布后,客户端请求图片地址为:http://localhost/RsSDSMainService/Code
3.利用Web工具来模拟请求图片地址,将会出现如下情况:响应的请求代码是200,类型也是image/jpg,可是长度却是空的,数据也是空的。如果直接返回的是FileStream.OpenRead(filePath),则客户端请求的响应是正常响应,其实这内部是由原因的,如果想之前返回Stream,Http响应体肯定是空的,因为Stream的读取位置已经到末尾了,所以请求发送过来时,服务响应读取Stream将会是空的返回给客户端,这也就是前面遇到的情况。而FileStream则是直接OpenRead文件,读取的位置是0,所以返回的数据是正常。
4.解决如上问题:
问题的原因分析出来了,其实也就没必要用FileStream来操作,只需将Stream的读取位置设置0,然后再返回即可
更改后的代码:
Stream ICodeService.GetCheckCodeImage()
{
string code = null;
WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpg";
Stream imgStream = CodeRepository.GetCheckCodeStream(out code);
imgStream.Position = 0;
return imgStream;
}
浙公网安备 33010602011771号