Почему я теряю данные при минимизации JS и CSS с помощью GZip? - PullRequest
0 голосов
/ 18 ноября 2011

У меня была странная проблема с GZip, и я надеюсь, что вы мне поможете.

using (MemoryStream memoryStream = new MemoryStream(10240))
{
   //isCompressed will be true if the browser accepts gzip
   using (Stream writer = isCompressed ?
                    (Stream)(new GZipStream(memoryStream, CompressionMode.Compress)) :
                    memoryStream)
   {
      StringBuilder sb = new StringBuilder();

      //filenames is collection of multi js files need to be minify
      foreach (string fileName in fileNames)
      {
         sb.Append(File.ReadAllText(context.Server.MapPath(fileName)));
      }

      //minifier is an instance of Microsoft.Ajax.Utilities.Minifier
      string minifiedString = minifier.MinifyJavaScript(sb.ToString());

      byte[] bts = Encoding.UTF8.GetBytes(minifiedString);
      writer.Write(bts, 0, bts.Length);
   }
}

Длина bts на самом деле превышает 6000, однако, когда writer.Write(bts, 0, bts.length) было выполнено, писатель может написать только 2334 символа, я проверил внутреннюю информацию, она говорит, что операция не поддерживается, я был так смущен, и я не знаю почему?

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Если я понимаю сценарий, Vinay прав, что 6k сжимается.Однако зачем использовать пользовательский код для сжатия вашего контента?Почему бы просто не включить статическое и динамическое сжатие в IIS и позволить IIS выполнять свою работу?Кроме того, используйте библиотеку типа http://RequestReduce.com, которая будет автоматически комбинировать и минимизировать ваши css и js на лету без кода и, возможно, без конфигурации, а также спрайтовать ваши изображения.

0 голосов
/ 18 ноября 2011

Но почему ты запутался? Идея заключается не в том, чтобы сжимать скрипты - поэтому поток gzip займет несколько байтов и сожмет их - следовательно, результирующие данные будут иметь меньший размер, чем входные данные. Таким образом, ваши 6000 байтов сжимаются в 2334 байта.

...