我正在重新实现一个请求记录器作为Owin中间件,它记录了所有传入请求的请求url和正文。 我能够阅读身体,但如果我在我的控制器中的身体参数为空。倒带请求正文流
我猜它是空的,因为流的位置是在最后,所以当它试图反序列化身体时没有什么可以阅读的。在以前版本的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);
});
}
}
public class SampleController : ApiController
{
public void Post(ModelClass body)
{
// body is now null if the middleware reads it
}
}
另一种替代方法: 流anotherStream =新的MemoryStream(); context.Request.Body.CopyToAsync(anotherStream); –
在ASP.NET Core(其中invoke方法将具有以下签名'异步任务调用(HttpContext上下文)'),您可以执行以下操作以获取缓冲流,以便您可以多次查找和读取它; 'context.Request.EnableRewind()'(在Microsoft.AspNetCore.Http.Internal.BufferingHelper中找到的HttpRequest扩展方法)。 – jfiskvik
@jfiskvik您的意见对我来说是非常有用的,它帮助我一些处理,在我的中间件 – ExtremeSwat