【发布时间】:2014-03-15 08:22:34
【问题描述】:
我正在将请求记录器重新实现为 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
}
}
【问题讨论】:
标签: asp.net .net asp.net-web-api owin owin-middleware