启用gzip/deflate压缩

Ren*_*uis 6 servicestack servicestack-bsd

我使用ServiceStack(版本3.9.44.0)作为Windows服务(所以我没有使用IIS),我既可以将其作为API使用,也可以将其用作服务网页.

但是,当客户端支持压缩时,我无法确定应该如何启用压缩.

我想如果客户端的请求包含Accept-Encoding:gzip,deflate头部,ServiceStack将透明地压缩数据,但我没有Content-Encoding:gzip在返回的响应中看到任何相应的.

所以我有几个相关的问题:

  1. 在使用ServiceStack作为独立服务(没有IIS)的上下文中,如何在浏览器接受响应时为响应启用压缩.

  2. 在C#客户端的上下文中,我如何确保压缩客户端/服务器之间的通信.

如果我遗失了什么,欢迎任何帮助.

谢谢.

Joh*_*ohn 9

如果要在API中全局启用压缩,另一个选项是:

将此覆盖添加到AppHost:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
{
    return new MyServiceRunner<TRequest>(this, actionContext);
}
Run Code Online (Sandbox Code Playgroud)

然后像这样实现该类:

public class MyServiceRunner<TRequest> : ServiceRunner<TRequest>
{
    public MyServiceRunner(IAppHost appHost, ActionContext actionContext) : base(appHost, actionContext)
    {
    }

    public override void OnBeforeExecute(IRequestContext requestContext, TRequest request)
    {
        base.OnBeforeExecute(requestContext, request);
    }

    public override object OnAfterExecute(IRequestContext requestContext, object response)
    {
        if ((response != null) && !(response is CompressedResult))
            response = requestContext.ToOptimizedResult(response);

        return base.OnAfterExecute(requestContext, response);
    }

    public override object HandleException(IRequestContext requestContext, TRequest request, Exception ex)
    {
        return base.HandleException(requestContext, request, ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

将调用OnAfterExecute并让您有机会更改响应.在这里,我正在压缩任何非空且尚未压缩的东西(如果我在某处使用ToOptimizedResultUsingCache).如果你需要,你可以更有选择性但在我的情况下,我是所有与json的POCO对象.

参考


Ren*_*uis 7

对于那些感兴趣的人,部分回答我自己的问题,你可以使用扩展方法,ToOptimizedResult()或者,如果你使用缓存ToOptimizedResultUsingCache().

例如,返回压缩结果:

public class ArticleService : Service
{
  public object Get(Articles request) {
    return base.RequestContext.ToOptimizedResult( 
       new List<Articles> { 
            new Article {Ref = "SILVER01", Description = "Silver watch"},
            new Article {Ref = "GOLD1547", Description = "Gold Bracelet"}
       });
  }
}
Run Code Online (Sandbox Code Playgroud)

参考