Mak*_*kla 3 asp.net asp.net-core asp.net-core-2.1
我正在关注这篇文章如何记录所有请求。
但是这段代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
不起作用,因为我得到了
"A non-empty request body is required."
Run Code Online (Sandbox Code Playgroud)
在具有[ApiController]
属性的控制器中
[HttpPut("MyMethod")]
public async Task<ActionResult<MyModel>> MyMethod([FromBody]MyArgs model)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试各种组合
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;
}
Run Code Online (Sandbox Code Playgroud)
但没有任何效果。我在这里想念什么?在SO上有类似解决方案的一些答案,但我不明白为什么在我的情况下它不起作用。
如果我注释阅读正文的代码,则可以。
我一直在等待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;
}
Run Code Online (Sandbox Code Playgroud)
引发错误:
无法访问已处置的对象。对象名称:“ 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;
}
Run Code Online (Sandbox Code Playgroud)
谢谢@Tseng。
归档时间: |
|
查看次数: |
965 次 |
最近记录: |