我正在重新实现一个请求记录器作为Owin Middleware,它记录所有传入请求的请求URL和正文.我能够读取正文,但是如果我在控制器中执行body参数则为null.
我猜它是空的,因为流的位置在最后,因此在尝试反序列化主体时没有什么可读的.我在以前版本的Web API中遇到了类似的问题,但是能够将Stream位置设置回0.这个特定的流引发This stream does not support seek operations异常.
在最新版本的Web API 2.0中,我可以Request.HttpContent.ReadAsStringAsync()在我的请求记录器内部调用,并且主体仍然可以直接到达控制器.
如何在阅读后回放流?
要么
如何在不消费的情况下阅读请求体?
public class RequestLoggerMiddleware : OwinMiddleware
{
public RequestLoggerMiddleware(OwinMiddleware next)
: base(next)
{
}
public override Task Invoke(IOwinContext context)
{
return Task.Run(() => {
string body = new StreamReader(context.Request.Body).ReadToEnd();
// log body
context.Request.Body.Position = 0; // cannot set stream position back to 0
Console.WriteLine(context.Request.Body.CanSeek); // prints false
this.Next.Invoke(context);
});
}
}
Run Code Online (Sandbox Code Playgroud)
public class SampleController : ApiController
{
public void Post(ModelClass …Run Code Online (Sandbox Code Playgroud)