Не уверен, зачем тебе это нужно.context.Result
- это экземпляр IActionResult
, вы можете манипулировать им как хотите.Если вы действительно хотите прочитать Response.Body
, можно сделать что-то хакерское.
Поскольку значение по умолчанию Response.Body
не является читаемым Stream
, чтобы сделать тело читаемым, мынеобходимо перехватить ответ, а именно заменить Body
нашим собственным экземпляром Stream
:
- Мы можем динамически создать новый поток памяти перед выполнением действия и перехватитьпо умолчанию
Response.Body
поток. - Когда действие выполнено, прочитайте поток, используя
StreamReader
, сделайте некоторую работу и установите Response.Body=your new stream
.
Безопасно угнать Response.Body
простымпоток памяти, потому что тип Body
является простым Stream
.
public class MyCustomFilter : ActionFilterAttribute
{
private MemoryStream responseBody ;
public override void OnActionExecuting(ActionExecutingContext context){
this.responseBody=new MemoryStream();
// hijack the real stream with our own memory stream
context.HttpContext.Response.Body = responseBody;
}
public override void OnResultExecuted(ResultExecutedContext context)
{
responseBody.Seek(0, SeekOrigin.Begin);
// read our own memory stream
using (StreamReader sr = new StreamReader(responseBody))
{
var actionResult= sr.ReadToEnd();
Console.WriteLine(actionResult);
// create new stream and assign it to body
// context.HttpContext.Response.Body = ;
}
// no ERROR on the next line!
base.OnResultExecuted(context);
}
}
Для целей тестирования я создаю метод действия:
[MyCustomFilter]
public IActionResult Index()
{
return Ok("it wooooooooorks");
}