我在捕獲HTML輸出的動作上使用以下篩選器,將其轉換爲字符串,執行一些操作以修改字符串,並返回帶有新的ContentResult串。不幸的是,我一直以空字符串結束。使用控制器動作篩選器捕獲HTML輸出
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;
}
}
我牽制是的StreamReader(流).ReadToEnd()返回一個空字符串,但我想不出爲什麼。
任何想法如何解決這個問題?
編輯:我已經將OnActionExecuted更改爲OnResultExecuted,現在它在View生成後調用,但流仍然是空的!
警告:不建議在操作篩選器中使用實例變量。您無法保證在每個請求中都獲得ActionFilterAttribute的新實例。我將我的代碼從這個答案中解析出來,並且在每秒產生數以千計的請求時遇到了麻煩 - 線(線程)正在越過。按照本文中的建議將實例變量存儲在filterContext.HttpContext.Items中:http:// stackoverflow。com/a/8937793/140449 – jaminto