Ho il seguente filtro in atto su un'azione per acquisire l'output HTML, convertirlo in una stringa, eseguire alcune operazioni per modificare la stringa e restituire ContentResult con il nuovo stringa. Sfortunatamente continuo a finire con una corda vuota.Acquisizione dell'output HTML con un filtro di azione del controller
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;
}
}
ho immobilizzato che StreamReader (stream) .ReadToEnd() restituisce una stringa vuota, ma non riesco a capire perché.
Qualche idea su come risolvere questo problema?
EDIT: Ho modificato l'OnActionExecuted su OnResultExecuted e ora viene chiamato dopo che la Vista è stata generata, ma lo stream è ancora vuoto!
un avviso: non è consigliabile utilizzare variabili di istanza nei filtri azione. non ti è garantito di ottenere una nuova istanza di ActionFilterAttribute su ogni richiesta. Ho basato il mio codice su questa risposta e mi sono messo nei guai quando è andato in produzione con migliaia di richieste al secondo - i fili (thread) si sono incrociati. memorizza le variabili di istanza in filterContext.HttpContext.Items come suggerito in questo post: http: // stackoverflow.it/a/8937793/140449 – jaminto