2009-09-04 14 views
9

Oto, co konkretnie próbuję zrobić:Jak mogę odzyskać html odpowiedzi z modułu HttpModule?

Napisałem moduł HttpModule, aby wykonać śledzenie specyficzne dla witryny. Niektóre stare strony .aspx na naszej stronie są zakodowane bez rzeczywistych kontroli, ale są plikami .aspx, więc mój moduł nadal działa, gdy są żądane.

Moduł obsługi mojego modułu jest dołączony do PostRequestHandlerExecute, więc uważam, że to, co zostanie odesłane do requestera, powinno być już ustalone.

Potrzebuję móc wyodrębnić dowolny ciąg w tagu tytułu. jeśli

<title>Chunky Bacon</title> 

Więc jest wysyłana do wnioskodawcy w końcowej renderowane HTML. Potem chcę "Chunky Bacon".

Pomysły?

+0

co masz na myśli "wyodrębnić ciąg znaków w tagu"? Czy próbujesz manipulować odpowiedzią przesyłaną z powrotem do requestera? Nie jest jasne, co próbujesz zrobić. – NerdFury

+0

Przepraszam, zapomniałem, że mój tag HTML nie wyświetli się, dopóki nie rozstawię go na blok kodu. Nie potrzebuję manipulować odpowiedzią, po prostu wyodrębnij ciąg wewnątrz tagu tytułu. – spilliton

+0

Aby wyjaśnić, czy próbujesz pobrać treść z odpowiedzi lub próbujesz przeanalizować tag z treści? –

Odpowiedz

22

Zabawne wyzwanie.

Oto kod:

StreamWatcher.cs

public class StreamWatcher : Stream 
    { 
     private Stream _base; 
     private MemoryStream _memoryStream = new MemoryStream(); 

     public StreamWatcher(Stream stream) 
     { 
      _base = stream; 
     } 

     public override void Flush() 
     { 
      _base.Flush(); 
     } 

     public override int Read(byte[] buffer, int offset, int count) 
     { 
      return _base.Read(buffer, offset, count); 
     } 

     public override void Write(byte[] buffer, int offset, int count) 
     { 
      _memoryStream.Write(buffer, offset, count); 
      _base.Write(buffer, offset, count); 
     } 

     public override string ToString() 
     { 
      return Encoding.UTF8.GetString(_memoryStream.ToArray()); 
     } 

     #region Rest of the overrides 
     public override bool CanRead 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool CanSeek 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override bool CanWrite 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override long Seek(long offset, SeekOrigin origin) 
     { 
      throw new NotImplementedException(); 
     } 

     public override void SetLength(long value) 
     { 
      throw new NotImplementedException(); 
     } 

     public override long Length 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public override long Position 
     { 
      get 
      { 
       throw new NotImplementedException(); 
      } 
      set 
      { 
       throw new NotImplementedException(); 
      } 
     } 
     #endregion 
    } 

TitleModule.cs

public class TitleModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    private static Regex regex = new Regex(@"(?<=<title>)[\w\s\r\n]*?(?=</title)", RegexOptions.Compiled | RegexOptions.IgnoreCase); 
    private StreamWatcher _watcher; 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += (o, e) => 
     { 
      _watcher = new StreamWatcher(context.Response.Filter); 
      context.Response.Filter = _watcher; 
     }; 


     context.EndRequest += (o, e) => 
     { 
      string value = _watcher.ToString(); 
      Trace.WriteLine(regex.Match(value).Value.Trim()); 
     }; 
    } 
} 
+0

To prawda, dzięki broseph! Nadal jestem zaskoczony, że potrzeba tak wielu linii kodu ... – spilliton

+0

Doskonałe rozwiązanie! – gljivar

+0

Z 4.6.1 AFAIK należy wdrożyć metody, które zwiększają wyjątek NotImplementedException. Najłatwiejszym sposobem na to jest odroczenie wszystkich połączeń z _memoryStream –

3

Jest artykuł na 4GuysFromRolla który mówi o tworzeniu httpResponse filtry, które są zasadniczo strumienie, które przetwarzają odpowiedź przed passi przechodzimy do końcowego strumienia wyjściowego (przechwytującego).

http://aspnet.4guysfromrolla.com/articles/120308-1.aspx

+0

Fajnie, czytałem trochę o nich w google, gdy szukam rozwiązania, wydaje się, że głównym celem napisania jednego z nich jest manipulowanie kodem HTML jest wysyłany, zanim zostanie wysłany. Ponieważ nie manipuluję i po prostu potrzebuję dostępu do HTML, pomyślałem, że to będzie przesada, ale jeśli to jedyny sposób ... – spilliton

Powiązane problemy