c# - ServiceStack流压缩

标签 c# compression servicestack

我正在从 ServiceStack 服务返回数据流,如下所示。请注意,我需要这样做,而不是概述的方式 here因为我需要在数据写入输出流后执行一些清理操作。

using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
    fs.WriteTo(Response.OutputStream);
}
Response.EndRequest();
...cleanup code...

压缩是在返回简单 DTO 的其他服务中通过使用类似于 this answer 的 ServiceRunner 来处理的。 。但是,上面的流响应永远不会命中该代码,因为 OnAfterExecute 中的响应对象始终为 null。我可以按如下方式在服务方法内部手动压缩结果,但需要进行大量设置来确定是否需要压缩以及需要什么压缩,并手动设置正确的 HTTP header (下面省略)。

var outStream = new MemoryStream();
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
using (var tinyStream = new GZipStream(outStream, CompressionMode.Compress))
{
    fs.CopyTo(tinyStream);
    outStream.WriteTo(Response.OutputStream);
}
Response.EndRequest();
...cleanup code...

ServiceStack 中是否有一种方法可以为我处理这种压缩,类似于使用 ServiceRunner 的方式?

最佳答案

我不太确定您对 ServiceStack 在 ServiceRunner 中处理压缩的方式有何看法。是因为它在 ServiceStack API 中是全局的吗?

对于您的示例,我认为类似下面的内容可以工作并满足您在数据写入输出流后执行一些清理的需要......

public class FStreamService : Service
{
    public object Get(FStream request)
    {
        var filePath = @"c:\test.xml";
        var compressFileResult = new CompressedFileResult(filePath); //CompressedResult in ServiceStack.Common.Web.CompressedFileResult
        compressFileResult.WriteTo(Response.OutputStream);
        Response.EndRequest();
        //  ...cleanup code...
    }
}

根据上面的评论更新,使用一些 ServiceStack 扩展添加压缩

public object Get(FStream request)
{
    var filePath = @"c:\test.xml";
    using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        var compressedBtyes = fs.ToUtf8String().Compress(this.RequestContext.CompressionType);
        new CompressedResult(compressedBtyes).WriteTo(Response.OutputStream);           
    }
    Response.EndRequest();
        //  ...cleanup code...
}

如果你想在 ServiceRunner 中使用它,类似这样的东西应该可以工作......

public override object OnAfterExecute(IRequestContext requestContext, object response)
{
    var resp = requestContext.Get<IHttpResponse>();
    response = requestContext.ToOptimizedResult(requestContext.Get<IHttpResponse>().OutputStream);       

    return base.OnAfterExecute(requestContext, response);
}

<罢工>

关于c# - ServiceStack流压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18836441/

相关文章:

c# - 在 c# 中重新创建 Az.Connect-AzAccount

c# - 如何将自定义信息存储到 Outlook AppointmentItem

design-patterns - 使用 ServiceStack 在 "per object per user"基础上控制权限的最佳设计模式?

compression - logrotate 压缩格式

c# - 无法解压缩 ZLIB/DEFLATE 数据

c# - 如何使用 DataAnnotation 将对象序列化为 JSON 以使用 ServiceStack 请求格式化双属性

c# - 从 WSDL 生成 ServiceStack 服务

c# - 比较 2 个不同数据库中的 2 个表

c# - 以编程方式设置和保存与导入 Assets 关联的图标

ios - 如何生成iOS代码以绘制图像?