Ren*_*uis 6 servicestack servicestack-bsd
我使用ServiceStack(版本3.9.44.0)作为Windows服务(所以我没有使用IIS),我既可以将其作为API使用,也可以将其用作服务网页.
但是,当客户端支持压缩时,我无法确定应该如何启用压缩.
我想如果客户端的请求包含Accept-Encoding:gzip,deflate头部,ServiceStack将透明地压缩数据,但我没有Content-Encoding:gzip在返回的响应中看到任何相应的.
所以我有几个相关的问题:
在使用ServiceStack作为独立服务(没有IIS)的上下文中,如何在浏览器接受响应时为响应启用压缩.
在C#客户端的上下文中,我如何确保压缩客户端/服务器之间的通信.
如果我遗失了什么,欢迎任何帮助.
谢谢.
如果要在API中全局启用压缩,另一个选项是:
将此覆盖添加到AppHost:
public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext actionContext)
{
return new MyServiceRunner<TRequest>(this, actionContext);
}
Run Code Online (Sandbox Code Playgroud)
然后像这样实现该类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
将调用OnAfterExecute并让您有机会更改响应.在这里,我正在压缩任何非空且尚未压缩的东西(如果我在某处使用ToOptimizedResultUsingCache).如果你需要,你可以更有选择性但在我的情况下,我是所有与json的POCO对象.
对于那些感兴趣的人,部分回答我自己的问题,你可以使用扩展方法,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"}
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3157 次 |
| 最近记录: |