ServiceStack是否支持二进制响应?

Seb*_*ood 15 servicestack

ServiceStack服务中是否有任何机制可以返回流/大二进制数据?WCF的MTOM支持很难但在返回大量数据时却没有文本转换开销.

rus*_*der 18

我喜欢服务堆栈,这个litle代码足以从内存流中返回Excel报告

public class ExcelFileResult : IHasOptions, IStreamWriter
{
    private readonly Stream _responseStream;
    public IDictionary<string, string> Options { get; private set; }

    public ExcelFileResult(Stream responseStream)
    {
        _responseStream = responseStream;

        Options = new Dictionary<string, string> {
             {"Content-Type", "application/octet-stream"},
             {"Content-Disposition", "attachment; filename=\"report.xls\";"}
         };
    }

    public void WriteTo(Stream responseStream)
    {
        if (_responseStream == null) 
            return;

        _responseStream.WriteTo(responseStream);
        responseStream.Flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • ServiceStack提供了许多BCL类的附加功能作为扩展方法.`Stream.WriteTo`位于`ServiceStack.Text.StreamExtensions.WriteTo`. (2认同)

myt*_*thz 16

从鸟瞰角度来看,ServiceStack可以返回以下任何一个:

  • 任何DTO对象 - >序列化为Response ContentType
  • 用于自定义HTTP响应的HttpResult,HttpError,CompressedResult(IHttpResult)

以下类型未转换并直接写入响应流:

  • IStreamWriter
  • byte [] - 包含application/octet-stream内容类型.

细节

除了返回普通的C#对象之外,ServiceStack还允许您返回任何Stream或IStreamWriter(这对您写入响应流的方式更加灵活):

public interface IStreamWriter
{
    void WriteTo(Stream stream);
}
Run Code Online (Sandbox Code Playgroud)

两者都允许您直接写入Response OutputStream而无需任何额外的转换开销.

如果要在同一时间自定义HTTP标头,只需要实现IHasOptions,其中任何字典条目都写入Response HttpHeaders.

public interface IHasOptions
{
    IDictionary<string, string> Options { get; }
}
Run Code Online (Sandbox Code Playgroud)

除此之外,IHttpResult允许甚至更精细地控制HTTP输出,您可以在其中提供自定义Http响应状态代码.您可以参考HttpResult对象的实现,以实现上述接口的实际实现.