Как я могу получить ответ html из HttpModule?

9

Вот что я конкретно пытаюсь сделать:

Я написал HttpModule для отслеживания определенного сайта. Некоторые старые .aspx-страницы на нашем сайте жестко закодированы без реальных элементов управления, но они являются .aspx файлами, поэтому мой модуль все еще работает, когда они запрашиваются.

Мой обработчик модуля прикреплен к PostRequestHandlerExecute, поэтому я считаю, что то, что будет отправлено обратно запрашивающему, должно быть уже определено.

Мне нужно иметь возможность извлекать любую строку в теге title.

Итак, если

<title>Chunky Bacon</title>

отправляется инициатору запроса в окончательном HTML. Затем я хочу "Chunky Bacon".

Идеи?

  • 0
    что вы имеете в виду "извлечь любую строку в теге"? Вы пытаетесь манипулировать ответом, отправляемым обратно запрашивающей стороне? Не ясно, что вы пытаетесь сделать.
  • 0
    извините, я забыл, что мой HTML-тег не будет отображаться, если я не поместил его в блок кода. Мне не нужно манипулировать ответом, просто извлеките строку внутри тега title.
Показать ещё 2 комментария
Теги:
httpmodule

2 ответа

21
Лучший ответ

Увлекательная маленькая задача.

Здесь код:

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
    Это делает это, спасибо, братан! Я все еще очень удивлен, что для выполнения требуется так много строк кода ...
  • 0
    Отличное решение!
Показать ещё 1 комментарий
3

Существует статья о 4GuysFromRolla, в которой говорится о создании фильтров HttpResponse, которые в основном представляют потоки, обрабатывающие ответ, прежде чем передать его в конечный выходной поток (перехватчик).

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

  • 0
    Круто, я немного читал об этом в Google, когда искал решение. Кажется, основная цель написания одного из них - манипулировать HTML-кодом, который отправляется до его отправки. Поскольку я не манипулирую и мне просто нужен доступ к HTML, я подумал, что это будет излишним, но если это единственный способ ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню