我正在重新實現一個請求記錄器作爲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