К основному контенту

Sliverlight и gzip сжатие трафика в WCF [Sliverlight and gzip compression of traffic using WCF]


Самый простой способ добавить gzip/deflate сжатие в WCF:
  1. Добавить метод SetupOutputCompression() в Ваш сервис:
    private void SetupOutputCompression()
    {
     HttpRequest request = HttpContext.Current.Request;
     HttpResponse response = HttpContext.Current.Response;
     string acceptEncoding = request.Headers["Accept-Encoding"];
     if (string.IsNullOrEmpty(acceptEncoding) == false)
     {
      Stream uncompressedStream = response.Filter;
      acceptEncoding = acceptEncoding.ToLower();
    
      if (acceptEncoding.Contains("gzip"))
      {
       response.Filter = new GZipStream(uncompressedStream, CompressionMode.Compress);
       response.AppendHeader("Content-Encoding", "gzip");
      }
      else if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
      {
       response.Filter = new DeflateStream(uncompressedStream, CompressionMode.Compress);
       response.AppendHeader("Content-Encoding", "deflate");
      }
     }
    } 
  2. Вызвать метод SetupOutputCompression() в конструкторе Вашего сервиса:
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class MyServiceWithCompression
    {
     public MyServiceWithCompression()
     {
      SetupOutputCompression();
     }
    ...
    ...
    ...
    ...
    ...
    ...
    } 
Вот и все, компилируем, запускаем, забываем о проблеме сжатия :)

Достоинства решения. Технология проста, на сервере сжатие происходит приведенным кодом, на клиенте же самим браузером. Ненужно тратить время на настройку сжатия самим WCFом, это, порой, не простое дело (например вот). Ненужно изменять клиент, то есть можно применять на работающих системах. Не нужно настраивать IIS.

Недостатки решения. Все современные браузеры поддерживают сжатие, возможны проблемы с IE6. Также в случае если браузер не поддерживает сжатие или оно отключено - нечего страшного не произойдет, но трафик жаться не будет. Также возможны проблемы с IIS6, но я с таковыми не столкнулся.

Вердикт. Опираясь на данные сайта gs.statcounter.com найдем долю старых браузеров: IE6 6.5% + другие 3.3% = 9,8%. То есть 90% пользователей нашего приложения будут получать сжатый трафик. По моему очень даже хорошо!

P.S.: Легким движением руки метод SetupOutputCompression() можно добавить на страницу ASP.NET, потом запустить в OnInit() и теперь страница отдает сжатый контент. Пойдем дальше, вынесем механизм сжатия в BasePage - теперь все ASP.NET странички отдают сжатый контент. Легко и просто.

Комментарии

  1. Привет, парился с gzip копрессией 2 дня(собрал CustomBinding и т.д.), не смог заставить заработать(на больших сообщениях появлялась ошибка "CommunicationException NotFound") , твоё решение сходу заработало с первого раза !!! Большое спасибо.

    ОтветитьУдалить

Отправить комментарий