Estoy tratando de configurar IAsyncActionFilter para registrar el cuerpo de la solicitud para algunas solicitudes de API. Pero cuando trato de leer el flujo del cuerpo siempre obtengo una cadena vacía.
Aquí está mi código: StringContent siempre es una cadena vacía, aunque haya un cuerpo json en las solicitudes posteriores.
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { ActionExecutedContext rContext = null; string stringContent = string.Empty; try { context.HttpContext.Request.EnableBuffering(); context.HttpContext.Request.Body.Position = 0; using (var reader = new StreamReader(context.HttpContext.Request.Body)) { stringContent = await reader.ReadToEndAsync(); context.HttpContext.Request.Body.Position = 0; } rContext = await next(); } catch (Exception) { throw; } }No quiero usar middleware, porque necesito registrar solo algunos de los controladores.
El cuerpo de la solicitud ya ha sido leído por el enlazador de modelos MVC en el momento en que su IAsyncActionFilter ejecuta https://github.com/aspnet/Mvc/issues/5260 .
Como una solución rápida, puede agregar
app.Use(next => context => { context.Request.EnableBuffering(); return next(context); }); en su startup.cs Configure () ANTES de su llamada UseEndpoints
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.Use(next => context => { context.Request.EnableBuffering(); return next(context); }); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }Por supuesto, esto habilitaría el almacenamiento en búfer del cuerpo de la solicitud para todas sus solicitudes, lo que puede no ser deseable. Si ese es el caso, tendría que agregar alguna lógica condicional al delegado EnableBuffering.