【问题标题】:GZipStream in an WebHttpResponse producing no dataWebHttpResponse 中的 GZipStream 不产生数据
【发布时间】:2010-12-23 14:47:46
【问题描述】:

我想为支持它的客户端压缩我的 HTTP 响应。我正在使用C# Webserver

这是用于发送标准响应的代码:

IHttpClientContext context = (IHttpClientContext)sender;
IHttpRequest request = e.Request;

string responseBody = "This is some random text";

IHttpResponse response = request.CreateResponse(context);

using (StreamWriter writer = new StreamWriter(response.Body))
{
    writer.WriteLine(responseBody);
    writer.Flush();
    response.Send();
}

上面的代码运行良好。现在我在下面添加了 gzip 支持。当我使用支持 gzip 或自定义方法的浏览器对其进行测试时,它返回一个空字符串。我确定我错过了一些简单的东西,但我找不到它......

IHttpClientContext context = (IHttpClientContext)sender;
IHttpRequest request = e.Request;

string acceptEncoding = request.Headers["Accept-Encoding"];
string responseBody = "This is some random text";

IHttpResponse response = request.CreateResponse(context);

if (acceptEncoding != null && acceptEncoding.Contains("gzip"))
{
    byte[] bytes = ASCIIEncoding.ASCII.GetBytes(responseBody);
    response.AddHeader("Content-Encoding", "gzip");

    using (GZipStream writer = new GZipStream(response.Body, CompressionMode.Compress))
    {
         writer.Write(bytes, 0, bytes.Length);
         writer.Flush();
         response.Send();
    }
 }

 else
 {
     using (StreamWriter writer = new StreamWriter(response.Body))
     {
           writer.WriteLine(responseBody);
           writer.Flush();
           response.Send();
      }
 }

【问题讨论】:

  • 您使用的网络服务器是什么?我不认识你正在使用的接口。
  • 对不起,我更新了我的问题。这是 C# 网络服务器:webserver.codeplex.com

标签: c# .net http gzip


【解决方案1】:

皮埃尔,皮埃尔,皮埃尔......

您的代码无法按预期工作。

GZipStream 在从基础流中读取之前必须关闭。因为GZipStreamGZipStream.Dispose 中写入了强制gzip 页脚。

以下代码将起作用:

using (MemoryStream stream = new MemoryStream())
{
     using (GZipStream gZipStream = new GZipStream(stream, CompressionMode.Compress))
     gZipStream.Write(bytes, 0, bytes.Length);

     byte[] compressed = stream.ToArray();
     response.Body.Write(compressed, 0, compressed.Length);

     response.Send();
}

【讨论】:

    【解决方案2】:

    也许我错了,但您不需要 Content-Transfer-Encoding 标头吗? WebResponse 内部不提供这个吗?

    【讨论】:

      【解决方案3】:

      尝试添加

      response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
      

      【讨论】:

        【解决方案4】:

        在与 WebForms 相关的情况下,我结束了:

        • 不使用 .NET 的内置 GZip,而是使用 codeplex 的 DotNetZip 库。转换很容易,因为它模仿了内置的 GZip 类。
        • 先将压缩数据写入 MemoryStream,然后才将其重新写入响应流。

        然而,我并没有以此为目标:我只对通过 http 发送压缩数据进行性能测试感兴趣。

        如果问题在于您的问题的压缩部分,也许这会对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-06
          • 1970-01-01
          • 2012-11-05
          相关资源
          最近更新 更多