我正在创建一个动作过滤器,它应该读取动作返回的响应,从中收集一些数据然后记录它,但我找不到任何可以读取响应体的地方。我尝试使用以下代码在HttpContext中的respone中访问属性名称OutputStream,但是我不断收到错误,指出此流不支持Length属性和Read方法。
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
byte[] buffer = new byte[filterContext.HttpContext.Response.OutputStream.Length];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = filterContext.HttpContext.Response.OutputStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
string html = Encoding.UTF8.GetString(ms.ToArray());
}
}
答案 0 :(得分:1)
我无法从" Stream"中提取,因此我决定使用"结果数据"将数据存入我的日志。
public class LogResultFilter : IActionFilter, IResultFilter
{
public void OnResultExecuted(ResultExecutedContext filterContext)
{
var responseBody = string.Empty;
if (filterContext.Result is ViewResultBase)
{
responseBody = new JavaScriptSerializer().Serialize(((ViewResultBase)filterContext.Result).ViewData);
}
if (filterContext.Result is JsonResult)
{
responseBody = new JavaScriptSerializer().Serialize(((JsonResult)filterContext.Result));
}
// Continue...