HttpModule, Response.Filter и изображения не отображаются - PullRequest
4 голосов
/ 13 сентября 2009

HttpModule работает нормально («hello» заменяется на «hello world»), но по некоторым причинам изображения в WebForms не отображаются при добавлении модуля в Web.config. Когда модуль удаляется из файла Web.config, отображаются изображения в веб-формах.

Кто-нибудь знает почему?

HTML, созданный с или без HttpModule, точно такой же!

//The HttpModule

public class MyModule : IHttpModule
{
        #region IHttpModule Members

        public void Dispose()
        {
            //Empty
        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(OnBeginRequest);
            application = context;
        }

        #endregion

        void OnBeginRequest(object sender, EventArgs e)
        {
            application.Response.Filter = new MyStream(application.Response.Filter);
        }
}

// Фильтр - замените "привет" на "привет мир"

public class MyStream : MemoryStream
{
        private Stream outputStream = null;

        public MyStream(Stream output)
        {
            outputStream = output;
        }

        public override void Write(byte[] buffer, int offset, int count)
        {

            string bufferContent = UTF8Encoding.UTF8.GetString(buffer);
            bufferContent = bufferContent.Replace("hello", "hello world");
            outputStream.Write(UTF8Encoding.UTF8.GetBytes(bufferContent), offset, UTF8Encoding.UTF8.GetByteCount(bufferContent));

            base.Write(buffer, offset, count);
        }
}

Ответы [ 2 ]

4 голосов
/ 13 сентября 2009

Применяете ли вы модуль ко всем запросам? Вы не должны, так как это испортит все, что является двоичным. Потенциально вы можете просто сделать так, чтобы ваш обработчик событий применял фильтр только тогда, когда тип контента соответствует.

Для начала было бы лучше только применить модуль к определенным расширениям.

Честно говоря, ваша потоковая реализация тоже немного хитроумна - она ​​может не работать для символов, которые занимают несколько байтов при кодировании в UTF-8, и вы декодируете весь буфер, даже когда записана только его часть. Кроме того, вы можете разделить «привет» как «он», а затем «llo», с которым вы в настоящее время не справляетесь.

3 голосов
/ 13 сентября 2009

Попробуйте сделать это, это установит фильтр только для страниц aspx, и все остальные URL будут работать нормально.

void OnBeginRequest(object sender, EventArgs e)    
{
     if(Request.Url.ToString().Contains(".aspx"))        
         application.Response.Filter = new MyStream(application.Response.Filter);    
}

Есть несколько свойств, вы должны попытаться использовать Response.Url.AbsolutePath или другой код, который даст идеальный результат.

...