gpt4 book ai didi

c# - 如何在 asp net core 2.2 中间件中多次读取请求正文?

转载 作者:行者123 更新时间:2023-12-03 15:59:46 25 4
gpt4 key购买 nike

我试过这个:
Read request body twice
还有这个:
https://github.com/aspnet/Mvc/issues/4962
但没有用。
我像这样阅读请求正文:

app.Use(async (context, next) =>
{
var requestBody = await ReadStream(context.Request.Body);
var requestPath = context.Request.Path.ToString();
//Do some thing

await next.Invoke();

var responseStatusCode = context.Response.StatusCode;
//Do some other thing
});

private async Task<string> ReadStream(Stream stream)
{
using (var streamReader = new StreamReader(stream))
{
var result = await streamReader.ReadToEndAsync();

return result;
}
}

在 Controller 中,我得到“已处置的对象”或“空流”。

最佳答案

.netcore 3.1 版本的@HoussamNasser 上面的答案。我创建了一个可重用的函数来读取请求正文。请注意更改:HttpRequestRewindExtensions.EnableBuffering(request) . EnableBuffering 现在是 HttpRequestRewindExtensions 的一部分类(class)。

public async Task<JObject> GetRequestBodyAsync(HttpRequest request)
{
JObject objRequestBody = new JObject();

// IMPORTANT: Ensure the requestBody can be read multiple times.
HttpRequestRewindExtensions.EnableBuffering(request);

// IMPORTANT: Leave the body open so the next middleware can read it.
using (StreamReader reader = new StreamReader(
request.Body,
Encoding.UTF8,
detectEncodingFromByteOrderMarks: false,
leaveOpen: true))
{
string strRequestBody = await reader.ReadToEndAsync();
objRequestBody = SerializerExtensions.Deserialize<JObject>(strRequestBody);

// IMPORTANT: Reset the request body stream position so the next middleware can read it
request.Body.Position = 0;
}

return objRequestBody;
}

此函数将返回一个 JObject,可用于读取 Request Body 对象的属性。 SerializerExtensions 是我用于序列化和反序列化的自定义扩展。

在中间件中可以注入(inject) IHttpContextAccessor httpContextAccessor在构造函数中。然后访问 Request 对象,如 HttpRequest request = _httpContextAccessor.HttpContext.Request; .最后,可以调用像 GetRequestBodyAsync(request)这样的可重用函数

关于c# - 如何在 asp net core 2.2 中间件中多次读取请求正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54442553/

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