Включить сжатие gzip/deflate
Я использую ServiceStack (версия 3.9.44.0) в качестве службы Windows (поэтому я не использую IIS) и использую обе его возможности как в качестве API, так и для обслуживания веб-страниц.
Однако я не смог найти, как именно я должен включить сжатие, когда клиент поддерживает его.
Я предполагал, что ServiceStack будет прозрачно сжимать данные, если запрос клиента включает Accept-Encoding:gzip,deflate
заголовок, но я не вижу соответствующего Content-Encoding:gzip
в возвращенных ответах.
Итак, у меня есть пара связанных вопросов:
В контексте использования ServiceStack в качестве автономной службы (без IIS), как включить сжатие для ответов, когда браузер принимает его.
В контексте клиента 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"}
});
}
}