No1*_*ver 9 c# asp.net asp.net-web-api asp.net-core
我编写了在服务器方法调用后运行的过滤器,并将其内容打印到控制台。代码是用ASP.NET core v2.1编写的:
public class MyCustomFilter : ActionFilterAttribute
{
public override void OnResultExecuted(ResultExecutedContext context)
{
// ERROR on the next line!
using (StreamReader sr = new StreamReader(context.HttpContext.Response.Body))
{
Console.WriteLine(sr.ReadToEnd());
}
base.OnResultExecuted(context);
}
}
Run Code Online (Sandbox Code Playgroud)
结果-异常:
流不可读。
进一步的调查使我发现流 ( context.HttpContext.Response) 具有这些值:
这可以解释为什么它无法读取正文......
怎么解决?
不知道为什么你需要这样做。context.Result是 的一个实例IActionResult,您可以随意操纵它。如果你确实想阅读Response.Body,可以做一些 hacky 的事情。
由于默认值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);
}
}
Run Code Online (Sandbox Code Playgroud)
出于测试目的,我创建了一个操作方法:
[MyCustomFilter]
public IActionResult Index()
{
return Ok("it wooooooooorks");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13471 次 |
| 最近记录: |