我使用ServiceStack(版本3.9.44.0)作为一个Windows服务(所以我不使用IIS),我使用它的能力既作为一个API和服务网页。
但是,当客户端支持压缩时,我还没有找到我应该如何准确地启用压缩。
我想象ServiceStack会透明地压缩数据,如果客户端的请求包括Accept-Encoding:gzip,deflate
头,但我没有看到任何相应的Content-Encoding:gzip
在返回的响应。
我有几个相关的问题:
在使用ServiceStack作为独立服务(没有IIS)的上下文中,如何在浏览器接受响应时启用压缩
在c#客户端上下文中,如何类似地确保客户端/服务器之间的通信被压缩
如果我遗漏了什么,欢迎任何帮助。
谢谢。
如果你想在整个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.
引用- ServiceStack New Api
对于那些感兴趣的人,我自己的问题的部分答案,您可以使用扩展方法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"}
});
}
}
引用- <
- CachedServices.cs例子/gh>
- CompressedResult.cs
- Google Group question on Compression in ServiceStack