压缩服务栈的响应

Posted

技术标签:

【中文标题】压缩服务栈的响应【英文标题】:Compress the response of service stack 【发布时间】:2021-08-27 03:54:32 【问题描述】:

我尝试使用全局过滤器压缩服务堆栈的响应,但它不起作用并抛出 500 错误代码。这是我的代码

this.GlobalResponseFilters.Add((req, response, requestDto) =>
            
                response.AddHeader("Content-Encoding", "gzip");
                MemoryStream stream = new MemoryStream();
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, requestDto);
                var data = new GZipStream(stream, CompressionMode.Compress);
                response.WriteToResponse(response, "application/json");

这里我也尝试了 [CompressResponse] 属性

Mvc控制器

httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage 响应 = httpClient.GetAsync(url).Result;

ServiceStack.ServiceInterface

public interface ICommonDAL

 Task<string> Getdefaultvalue(Getvalue request);
 

[压缩响应]

公共类 CommonDAL : DBConnection, ICommonDAL

    public async Task<string> Getdefaultvalue(Getvalue request)
    
        return await WithConnection(async c =>
        
            var p = new DynamicParameters();
            p.Add("@pID", request.ID);
            p.Add("@pMode", request.Mode);
            var res= await c.QuerySingleAsync<string>("[dbo].[spdemo]", p, commandType: CommandType.StoredProcedure);
            return res
        );
    

【问题讨论】:

【参考方案1】:

请参考ServiceStack Compression Docs,例如您可以使用[CompressResponse] 属性压缩服务响应,例如:

[CompressResponse]
public class CompressedServices : Service

    public object Any(CompressDto request) => new CompressExamplesResponse(); 
    public object Any(CompressString request) => "foo"; 
    public object Any(CompressBytes request) => "foo".ToUtf8Bytes(); 
    public object Any(CompressStream request) => new MemoryStream("foo".ToUtf8Bytes()); 
    public object Any(CompressFile request) => new HttpResult(VirtualFileSources.GetFile("/foo"));

    public object Any(CompressAnyHttpResult request)
    
        return new HttpResult(new CompressExamplesResponse());    // DTO
        return new HttpResult("foo", "text/plain");               // string
        return new HttpResult("foo".ToUtf8Bytes(), "text/plain"); // bytes
        //etc
    

Http 标头

【讨论】:

[CompressResponse] 属性对响应内容长度没有任何改变。长度计数与之前的计数相同 @Prabhu 请使用原始 HTTP 标头和您的 C# 服务 impl 更新您的问题 ***.com/a/67918996/16183656 这是我的代码 @Prabhu 你应该更新你的问题,因为模组将删除非答案。请在您的问题中包含 HTTP 标头(例如使用 Chrome Web Inspector 或 Fiddler),只有这会显示响应是否被压缩。 在浏览器中响应被压缩,因为我在过滤器中使用了 Gzip 压缩器。但在这里我尝试压缩堆栈服务对控制器的响应

以上是关于压缩服务栈的响应的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core HttpClient处理响应压缩

nginx添加gzip压缩

在 Django 中为来自客户端的请求和来自服务器的响应(REST API)压缩 JSON 有效负载。

gzip压缩tomcat服务器响应包,大幅提升web性能

HTTP协议压缩格式和URL编码介绍

浏览器缓存和压缩优化技术