gpt4 book ai didi

asp.net - 倒带请求正文流

转载 作者:行者123 更新时间:2023-12-03 09:53:23 26 4
gpt4 key购买 nike

我正在将请求记录器重新实现为Owin中间件,该记录器记录了所有输入请求的请求URL和主体。 我可以读取正文,但是如果执行此操作,则 Controller 中的body参数为null。

我猜这是空的,因为流的位置在末尾,因此在尝试反序列化正文时没有什么可读取的。在先前版本的Web API中,我也遇到了类似的问题,但是能够将Stream位置设置回0。此特定的流引发This stream does not support seek operations异常。

在最新版本的Web API 2.0中,我可以在请求记录器中调用Request.HttpContent.ReadAsStringAsync(),并且正文仍可以完整地到达 Controller 。

阅读后如何重播流?

要么

如何在不使用请求主体的情况下阅读它?

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
}
}

最佳答案

刚找到一个解决方案。用包含数据的新流替换原始流。

    public override Task Invoke(IOwinContext context)
{
return Task.Run(() => {
string body = new StreamReader(context.Request.Body).ReadToEnd();
// log body

byte[] requestData = Encoding.UTF8.GetBytes(body);
context.Request.Body = new MemoryStream(requestData);
this.Next.Invoke(context);
});
}

如果您要处理大量数据,我相信 FileStream也可以替代。

关于asp.net - 倒带请求正文流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com