Теперь я вижу, что вы хотите сделать. И я думаю, что у меня может быть решение. Я использовал часть этого подхода в решении выходного кэша некоторое время назад, поэтому я думаю, что это сработает.
Сначала вам нужен собственный класс потока, который выглядит следующим образом:
private class CapturingResponseFilter : Stream
{
private readonly Stream _sink;
private readonly MemoryStream _mem;
public CapturingResponseFilter(Stream sink)
{
_sink = sink;
_mem = new MemoryStream();
}
public override bool CanRead
{
get { return true; }
}
public override bool CanSeek
{
get { return false; }
}
public override bool CanWrite
{
get { return false; }
}
public override long Length
{
get { return 0; }
}
public override long Position { get; set; }
public override long Seek(long offset, SeekOrigin direction)
{
return 0;
}
public override void SetLength(long length)
{
_sink.SetLength(length);
}
public override void Close()
{
_sink.Close();
_mem.Close();
}
public override void Flush()
{
_sink.Flush();
}
public override int Read(byte[] buffer, int offset, int count)
{
return _sink.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
_mem.Write(buffer, 0, count);
}
public string GetContents(Encoding enc)
{
var buffer = new byte[_mem.Length];
_mem.Position = 0;
_mem.Read(buffer, 0, buffer.Length);
return enc.GetString(buffer, 0, buffer.Length);
}
}
И тогда вы делаете что-то вроде этого в фильтре действия:
private Stream _originalOutputStream;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_originalOutputStream = filterContext.HttpContext.Response.Filter;
filterContext.HttpContext.Response.Flush();
filterContext.HttpContext.Response.Filter = new CapturingResponseFilter(filterContext.HttpContext.Response.Filter);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (_originalOutputStream == null) return;
filterContext.HttpContext.Response.Flush();
var capturingResponseFilter = (CapturingResponseFilter)filterContext.HttpContext.Response.Filter;
filterContext.HttpContext.Response.Filter = _originalOutputStream;
var textWritten = capturingResponseFilter.GetContents(filterContext.HttpContext.Response.ContentEncoding);
//Do what you want with your text (textWritten).
filterContext.HttpContext.Response.Write(textWritten);
}
я считал бы немного решение для взлома. Но я не видел ничего подобного.
Что вы хотите делать (и почему)? Если вы хотите удалить пустые строки, чтобы свести к минимуму вывод, вы должны, вероятно, посмотреть на сжатие результата с помощью gzip. –
Как вы знаете, после рендеринга страницы в исходном коде (HTML) в местах кода, за оставшиеся пустые строки .. напр: