2009-09-13 2 views
4

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

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

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); 
     } 
} 

ответ

4

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

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

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

+0

Создание обработчика события, применяющего фильтр на страницах .aspx, только это сделало. Спасибо за помощь. – thd

3

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

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

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

+0

Спасибо! Ваше предложение кода работает. – thd