Ali*_*ari 11 c# middleware asp.net-core-2.2
我试过这个: 读取请求正文两次 ,这个: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;
}
}
Run Code Online (Sandbox Code Playgroud)
在控制器中,我得到“处置对象”或“空流”。
Pra*_*era 16
.netcore 3.1 版本的@HoussamNasser 上面的回答。我创建了一个可重用的函数来读取请求正文。请注意更改:HttpRequestRewindExtensions.EnableBuffering(request)。EnableBuffering 现在是HttpRequestRewindExtensions类的一部分。
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;
}
Run Code Online (Sandbox Code Playgroud)
此函数将返回一个 JObject,可用于读取 Request Body 对象的属性。SerializerExtensions 是我用于序列化和反序列化的自定义扩展。
在中间件中,您可以注入IHttpContextAccessor httpContextAccessor构造函数。然后像HttpRequest request = _httpContextAccessor.HttpContext.Request;. 最后,可以调用可重用的函数,如GetRequestBodyAsync(request)
Ali*_*ari 10
经过一番努力并使用“context.Request.EnableRewind()”,它终于像这样工作了:
app.Use(async (context, next) =>
{
context.Request.EnableRewind();
var stream = context.Request.Body;
using (var reader = new StreamReader(stream))
{
var requestBodyAsString = await reader.ReadToEndAsync();
if (stream.CanSeek)
stream.Seek(0, SeekOrigin.Begin);
//Do some thing
await next.Invoke();
var responseStatusCode = context.Response.StatusCode;
//Do some other thing
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11068 次 |
| 最近记录: |