Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Now I see what you want to do. And I think I might have a solution. I have used parts of this approach in a output cache solution a while back, so I think it will work.</p> <p>First you need your own stream class that looks like this:</p> <pre><code>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); } } </code></pre> <p>And then you do something like this in your action filter:</p> <pre><code>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); } </code></pre> <p>I would consider it a little bit of a hack solution. But I haven't seen anything that isn't.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload