C# WebHttpResponse中的GZipStream不生成数据

C# WebHttpResponse中的GZipStream不生成数据,c#,.net,http,gzip,C#,.net,Http,Gzip,我想压缩支持它的客户端的HTTP响应。我正在使用 以下是用于发送标准响应的代码: IHttpClientContext context = (IHttpClientContext)sender; IHttpRequest request = e.Request; string responseBody = "This is some random text"; IHttpResponse response = request.CreateResponse(context); using (

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

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

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

也许我错了,但你不需要一个内容传输编码头吗?WebResponse是否在内部提供此功能?

也许我错了,但您不需要内容传输编码头吗?WebResponse内部不提供此功能吗?

尝试添加

response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
尝试添加

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

在与WebForms相关的情况下,我最终:

  • 不是使用.NET的内置GZip,而是使用codeplex中的库。转换很容易,因为它模仿了内置的GZip类
  • 首先将压缩后的数据写入MemoryStream,然后再将其重新写入响应流
然而,我并没有以此作为WebBrowser的目标:我只对通过http发送压缩数据进行性能测试感兴趣


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

在WebForms的相关情况下,我最终:

  • 不是使用.NET的内置GZip,而是使用codeplex中的库。转换很容易,因为它模仿了内置的GZip类
  • 首先将压缩后的数据写入MemoryStream,然后再将其重新写入响应流
然而,我并没有以此作为WebBrowser的目标:我只对通过http发送压缩数据进行性能测试感兴趣


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

皮埃尔,皮埃尔,皮埃尔

您的代码无法按预期工作

GZipStream
必须先关闭,然后才能读取基础流。因为
GZipStream
GZipStream.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();
}

皮埃尔,皮埃尔,皮埃尔

您的代码无法按预期工作

GZipStream
必须先关闭,然后才能读取基础流。因为
GZipStream
GZipStream.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();
}

您正在使用的Web服务器是什么?我不认识您正在使用的界面。对不起,我更新了我的问题。它是C#Webserver:您使用的web服务器是什么?我不认识您正在使用的界面。对不起,我更新了我的问题。它是C#Webserver: