System.Text.Ecoding.UTF8.GetString возвращает мусор - PullRequest
0 голосов
/ 10 августа 2010

Это сложный вопрос.У меня есть настройка фильтра ответов для преобразования html перед выпуском обратно в браузер (http://aspnetresources.com/articles/HttpFilters).. Это прекрасно работает на любой машине, кроме моей. На самом деле она работала на моей машине, пока мне не пришлось делать полный сброс, потому чтозаблокирован.

public override void Write(byte[] buffer, int offset, int count)
{
    string strBuffer =  System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);

Для всех остальных (и моих предыдущих) strBuffer содержит HTML. Теперь по какой-либо причине он возвращает мне ненужные символы. Любые идеи?

Обновление

Оказывается, что причиной проблемы является «Включить динамическое сжатие содержимого». По какой-то причине он получает gzip перед передачей в фильтр.1014 * Решение

Установка для параметра dynamicCompressionBeforeCache значения false в web.config устранила проблему.

<urlCompression doStaticCompression="true" doDynamicCompression="true" dynamicCompressionBeforeCache="false" />

Ответы [ 2 ]

0 голосов
/ 10 августа 2010

Вы указали эти байты: 31, 139, 8, 0, 0, 0, 0, 0, 4

Это недопустимый UTF-8.В частности, это будет означать символ Unicode U + 0031 («ИНФОРМАЦИОННЫЙ СЕПАРАТОР ОДИН»), за которым следуют байты 139 и 8 ... и 139, за которыми следует 8, не является допустимой UTF-8 байтовой последовательностью.Даже если эти действительно сформировали правильную последовательность, у вас будет 5 символов Unicode U + 0000 (NUL), за которыми следует U + 0004 (END OF TRANSMISSION).Вряд ли в действительном HTML.

Я не знаю, что вы на самом деле фильтруете, но это недопустимый текст UTF-8.На самом деле это вовсе не похоже на текст.Возможно ли, что вы на самом деле пытаетесь применить фильтр к двоичным данным, таким как изображение?

Обратите внимание, что у вас есть еще одна фундаментальная проблема с вашим методом фильтрации: вы предполагаете, что каждый буфер содержит полный текст.Для вас вполне возможно получить один буфер, который содержит первую половину символа, а затем второй буфер, содержащий оставшуюся его часть.Для этого и нужен интерфейс System.Text.Decoder - он с состоянием, запоминает отдельные символы.

0 голосов
/ 10 августа 2010

Похоже, что-то пошло не так.У меня тоже было странное поведение после блокировки.Для меня работало удаление временных файлов в C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

...