Вот что я конкретно пытаюсь сделать:
Я написал HttpModule для отслеживания определенного сайта. Некоторые старые .aspx-страницы на нашем сайте жестко закодированы без реальных элементов управления, но они являются .aspx файлами, поэтому мой модуль все еще работает, когда они запрашиваются.
Мой обработчик модуля прикреплен к PostRequestHandlerExecute, поэтому я считаю, что то, что будет отправлено обратно запрашивающему, должно быть уже определено.
Мне нужно иметь возможность извлекать любую строку в теге title.
Итак, если
<title>Chunky Bacon</title>
отправляется инициатору запроса в окончательном HTML. Затем я хочу "Chunky Bacon".
Идеи?
Увлекательная маленькая задача.
Здесь код:
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());
};
}
}
Существует статья о 4GuysFromRolla, в которой говорится о создании фильтров HttpResponse, которые в основном представляют потоки, обрабатывающие ответ, прежде чем передать его в конечный выходной поток (перехватчик).