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;           

}

posted on 2013-10-14 11:55  Andrewsy  阅读(1263)  评论(0)    收藏  举报

导航