c# - WebHttpResponse 中的 GZipStream 不产生任何数据

标签 c# .net http gzip

我想为支持它的客户端压缩我的 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();
      }
 }

最佳答案

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

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

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();
}

关于c# - WebHttpResponse 中的 GZipStream 不产生任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4519770/

相关文章:

c# - 在c#中将特殊字符写入xml

.net - 无法在 Visual Studio 2012 中加载 SOS.dll 扩展

json - 如何使用 express.js 传递 API url JSON http.get res.json(data)

html - 为什么不在 WYGIWYS 编辑器中将图像作为 base64 字符串嵌入

c# - Sitecore WFFM - 使用 session 中的数据预加载表单

c# - 将多个文件上传到 Azure Blob 存储

c# - 如何发送邮件异步

python - 如何在 python 中仅重试一次异常

使用 unicode 的 java 客户端和 C# 服务器

c# - 是否有执行 .SelectMany(x => x) 的 Linq 方法?