Включить сжатие gzip/deflate

Я использую ServiceStack (версия 3.9.44.0) в качестве службы Windows (поэтому я не< /em> с помощью IIS), и я использую обе его возможности как в качестве API, так и для обслуживания веб-страниц.

Однако я не смог найти, как именно я должен включить сжатие, когда клиент его поддерживает.

Я предположил, что ServiceStack будет прозрачно сжимать данные, если запрос клиента включает заголовок Accept-Encoding:gzip,deflate, но я не вижу соответствующего Content-Encoding:gzip в возвращаемых ответах.

Итак, у меня есть пара сопутствующих вопросов:

  1. В контексте использования ServiceStack в качестве отдельной службы (без IIS), как включить сжатие ответов, когда браузер его принимает.

  2. В контексте клиента C#, как я могу обеспечить сжатие связи между клиентом и сервером.

Если я что-то упустил, любая помощь будет приветствоваться.

Спасибо.


person Renaud Bompuis    schedule 10.05.2013    source источник


Ответы (2)


Если вы хотите включить глобальное сжатие в вашем 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). Вы можете быть более избирательным, если вам нужно, но в моем случае я все объекты POCO с json.

использованная литература

person John    schedule 18.08.2013

Для тех, кому интересно, частичный ответ на мой собственный вопрос, вы можете использовать метод расширения 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"}
       });
  }
}

использованная литература

person Renaud Bompuis    schedule 14.05.2013