【问题标题】: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
        });
    }

}

【问题讨论】:

    标签: gzip servicestack gzipstream json-api-response-converter


    【解决方案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 更新您的问题
    • @Prabhu 你应该更新你的问题,因为模组将删除非答案。请在您的问题中包含 HTTP 标头(例如使用 Chrome Web Inspector 或 Fiddler),只有这会显示响应是否被压缩。
    • 在浏览器中响应被压缩,因为我在过滤器中使用了 Gzip 压缩器。但在这里我尝试压缩堆栈服务对控制器的响应
    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2011-06-02
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多