- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在关注 this post如何记录所有请求。
但是这段代码:
public async Task Invoke(HttpContext context)
{
await this.LogRequest(context.Request);
await this._next(context);
}
private async Task LogRequest(HttpRequest request)
{
var body = request.Body;
request.EnableRewind();
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer, 0, buffer.Length);
request.Body.Seek(0, SeekOrigin.Begin);
var bodyAsText = Encoding.UTF8.GetString(buffer);
request.Body = body;
}
不工作,因为我得到
"A non-empty request body is required."
在具有 [ApiController]
属性的 Controller 中
[HttpPut("MyMethod")]
public async Task<ActionResult<MyModel>> MyMethod([FromBody]MyArgs model)
{
//...
}
我正在尝试做各种组合
string bodyAsText = null;
if (request.ContentLength > 0)
{
var body = request.Body;
request.EnableRewind();
using (var streamReader = new StreamReader(request.Body, Encoding.UTF8))
{
bodyAsText = await streamReader.ReadToEndAsync();
request.Body.Seek(0, SeekOrigin.Begin);
}
request.Body = body;
}
但没有任何作用。我在这里错过了什么?在 SO 上有一些类似解决方案的答案,但我不明白为什么它在我的情况下不起作用。
如果我注释阅读正文的代码,它会起作用。
最佳答案
我在等 Tseng 发布答案,因为他已经在评论中指出了我的问题和解决方案。不过他没做,我会尽量根据评论和调试经验来回答。
正如 Tseng 提到的 EnableRewind
应该在 var body = request.Body;
这段代码:
if (request.ContentLength > 0)
{
request.EnableRewind();
var body = request.Body;
using (var streamReader = new StreamReader(request.Body, Encoding.UTF8))
{
bodyAsText = await streamReader.ReadToEndAsync();
request.Body.Seek(0, SeekOrigin.Begin);
}
request.Body = body;
}
抛出错误:
Cannot access a disposed object. Object name: 'FileBufferingReadStream'.
在 await this._next(context); 行中
。
工作代码是:
if (request.ContentLength > 0)
{
request.EnableRewind();
var body = request.Body;
var buffer = new byte[Convert.ToInt32(request.ContentLength)];
await request.Body.ReadAsync(buffer, 0, buffer.Length);
request.Body.Seek(0, SeekOrigin.Begin);
bodyAsText = Encoding.UTF8.GetString(buffer);
request.Body = body;
}
谢谢@Tseng。
关于ASP.NET 核心 : log all requests (reading body twice) EnableRewind not working for [FromBody] attribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52931906/
BufferingHelper.EnableRewind(); 以上是 ASP.NET Core 2.2 中 HttpRequest 对象的扩展方法。它在 ASP.NET Core 3.0 中不再存在
我正在关注 this post如何记录所有请求。 但是这段代码: public async Task Invoke(HttpContext context) { await this.LogR
我是一名优秀的程序员,十分优秀!