压缩服务栈的响应
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 压缩器。但在这里我尝试压缩堆栈服务对控制器的响应以上是关于压缩服务栈的响应的主要内容,如果未能解决你的问题,请参考以下文章