Tengo el siguiente filtro en una acción para capturar el resultado HTML, convertirlo en una cadena, hacer algunas operaciones para modificar la cadena y devolver un resultado de contenido con el nuevo cuerda. Lamentablemente, sigo terminando con una cadena vacía.Capturar resultados HTML con un filtro de acción de controlador
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;
}
}
he inmovilizada que StreamReader (corriente) .ReadToEnd() devuelve una cadena vacía, pero no puedo entender por qué.
¿Alguna idea de cómo solucionar esto?
EDIT: He cambiado el OnActionExecuted a OnResultExecuted, y ahora se llama después de que se haya generado la vista, pero la secuencia todavía está vacía.
advertencia: no se recomienda el uso de variables de instancia en filtros de acción. no está garantizado que obtenga una nueva instancia de ActionFilterAttribute en cada solicitud. Basé mi código en esta respuesta y me metí en problemas cuando llegó la producción con miles de solicitudes por segundo: los hilos (hilos) se estaban cruzando. almacene las variables de instancia en filterContext.HttpContext.Items como se sugiere en esta publicación: http: // stackoverflow.com/a/8937793/140449 – jaminto