GZipStream в WebHttpResponse не производит данных - PullRequest
1 голос
/ 23 декабря 2010

Я хочу сжать свои 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();
      }
 }

Ответы [ 4 ]

1 голос
/ 25 декабря 2010

Пьер, Пьер, Пьер ....

Ваш код не может работать должным образом.

GZipStream должен быть закрыт перед чтением из базового потока . Потому что GZipStream напишите обязательный нижний колонтитул gzip в GZipStream.Dispose.

Будет работать следующий код:

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();
}
0 голосов
/ 23 декабря 2010

попробуйте добавить

response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
0 голосов
/ 23 декабря 2010

В связанной с WebForms ситуации я оказался:

  • Не использует встроенный GZip .NET, а DotNetZip библиотека из codeplex. Переход был легким, поскольку он имитирует встроенные классы GZip.
  • Первоначальная запись сжатых данных в MemoryStream и только затем повторная запись их в поток Response.

Я, однако, не предназначался для веб-браузеров этим: меня интересовала только отправка сжатых данных для теста производительности через http.

Если проблема связана с молниеносной частью вашей проблемы, возможно, это вам поможет.

0 голосов
/ 23 декабря 2010

Может быть, я ошибаюсь, но вам не нужен заголовок Content-Transfer-Encoding? Разве WebResponse не предоставляет это внутренне?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...