I've got the following filter in place on an action to capture the HTML output, convert it to a string, do some operations to modify the string, and return a ContentResult with the new string. Unfortunately, I keep ending up with an empty string.
private class UpdateFilter : ActionFilterAttribute
{
private Stream stream;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
stream = filterContext.HttpContext.Response.Filter;
stream = new MemoryStream();
filterContext.HttpContext.Response.Filter = stream;
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
StreamReader responsereader = new StreamReader(filterContext.HttpContext.Response.Filter); //empty stream? why?
responsereader.BaseStream.Position = 0;
string response = responsereader.ReadToEnd();
ContentResult contres = new ContentResult();
contres.Content = response;
filterContext.Result = contres;
}
}
I've pinned down that StreamReader(stream).ReadToEnd() returns an empty string, but I can't figure out why.
Any ideas how to fix this?
EDIT: I've changed the OnActionExecuted to OnResultExecuted, and now it is called after the View has been generated, but the stream is still empty!
Can you verify that stream is not NULL in the OnActionExectuted-method? I'm not sure the state of the stream-variable is being stored through the process..
Why don't you try to get the stream out of the filterContext:
I solved this by hijacking the HttpWriter, and having it write into a
StringBuilder
rather than the response, and then doing whatever needs to be done to/with the response before writing it to the output.I think I've developed a pretty good way to do this.
OnClose
method and play with the stream as you like.You can then derive from this to another attribute to access the stream and get the HTML:
Try rewinding the stream to the beginning by setting
Position = 0;
before you read it.