相关疑难解决方法(0)

在ASP.Net Core中请求内容解压缩

我有时需要将更大的JSON请求有效负载发布到我的ASP.Net核心控制器.有效载荷的大小保证(至少在我看来)压缩它.由于ASP.Net核心控制器似乎不支持开箱即用的压缩请求内容,因此我推出了自己的中间件.

实现这个是微不足道的,我不确定我是否在这里遗漏了一些东西.要么是因为有一种内置的方法来实现这一目标,要么是因为我从安全性或性能角度出现了一些重大错误?

public class GzipRequestContentEncodingMiddleware
{
    public GzipRequestContentEncodingMiddleware(RequestDelegate next)
    {
        if (next == null)
            throw new ArgumentNullException(nameof(next));

        this.next = next;
    }

    private readonly RequestDelegate next;
    private const string ContentEncodingHeader = "Content-Encoding";
    private const string ContentEncodingGzip = "gzip";
    private const string ContentEncodingDeflate = "deflate";

    public async Task Invoke(HttpContext context)
    {
        if (context.Request.Headers.Keys.Contains(ContentEncodingHeader) &&
            (context.Request.Headers[ContentEncodingHeader] == ContentEncodingGzip || 
            context.Request.Headers[ContentEncodingHeader] == ContentEncodingDeflate))
        {
            var contentEncoding = context.Request.Headers[ContentEncodingHeader];
            context.Request.Headers.Remove(ContentEncodingHeader);

            var destination = new MemoryStream();

            using (var decompressor = contentEncoding == ContentEncodingGzip
                ? (Stream) new …
Run Code Online (Sandbox Code Playgroud)

c# compression asp.net-core asp.net-core-middleware

24
推荐指数
2
解决办法
2617
查看次数

如何在运行中压缩http请求而不在内存中加载压缩缓冲区

我需要将http post请求中的大量数据发送到支持gziped编码请求的服务器.

从简单开始

public async Task<string> DoPost(HttpContent content)
{
  HttpClient client = new HttpClient();
  HttpResponseMessage response = await client.PostAsync("http://myUri", content);

  response.EnsureSuccessStatusCode();
  return await response.Content.ReadAsStringAsync();
}
Run Code Online (Sandbox Code Playgroud)

我刚刚添加了预压缩

public async Task<string> DoPost(HttpContent content, bool compress)
{
  if (compress) 
    content= await CompressAsync(content);

  return await DoPost(content);
}

private static async Task<StreamContent> CompressAsync(HttpContent content)
{
  MemoryStream ms = new MemoryStream();
  using (GZipStream gzipStream = new GZipStream(ms, CompressionMode.Compress, true))
  {
    await content.CopyToAsync(gzipStream);
    await gzipStream.FlushAsync();
  }

  ms.Position = 0;
  StreamContent compressedStreamContent = new StreamContent(ms);
  compressedStreamContent.Headers.ContentType = content.Headers.ContentType; …
Run Code Online (Sandbox Code Playgroud)

.net compression gzip c#-4.0 dotnet-httpclient

11
推荐指数
1
解决办法
5735
查看次数