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

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

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

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

Итак, у меня есть пара связанных вопросов:

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

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

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

Спасибо.

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.

Рекомендации

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

Рекомендации

Другие вопросы по тегам