6

我将ServiceStack(版本 3.9.44.0)用作 Windows 服务(所以我没有使用 IIS),并且我将它的功能用作 API 和提供网页。

但是,我无法找到当客户端支持压缩时我应该如何启用压缩。

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

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

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

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

如果我遗漏了什么,欢迎任何帮助。

谢谢你。

4

2 回答 2

9

如果你想在你的 API 中全局启用压缩,另一种选择是这样做:

将此覆盖添加到您的 AppHost:

public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
{
    return new MyServiceRunner<TRequest>(this, actionContext);
}

然后像这样实现该类:

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);
    }
}

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

参考

于 2013-08-18T16:30:34.287 回答
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"}
       });
  }
}

参考

于 2013-05-14T11:46:38.090 回答