Saltar al contenido

¿Hay alguna forma de obtener el cuerpo de la solicitud en .NET Core FilterAttribute?

Presta atención ya que en esta división encontrarás el arreglo que buscas.Este artículo fue evaluado por nuestros expertos para garantizar la calidad y veracidad de nuestro contenido.

Solución:

De acuerdo con este hilo de “La mejor manera de registrar / leer el cuerpo de la solicitud en un middleware”, lo siguiente debería funcionar:

// using Microsoft.AspNetCore.Http.Internal;

public class SampleActionFilterAttribute : TypeFilterAttribute

    ... 

    public void OnActionExecuting(ActionExecutedContext context)
    
        // read body before MVC action execution
        string bodyData = ReadBodyAsString(context.HttpContext.Request);
    

    private string ReadBodyAsString(HttpRequest request)
    
        var initialBody = request.Body; // Workaround

        try
        
            request.EnableRewind();

            using (StreamReader reader = new StreamReader(request.Body))
            
                string text = reader.ReadToEnd();
                return text;
            
        
        finally
        
            // Workaround so MVC action will be able to read body as well
            request.Body = initialBody; 
        

        return string.Empty;
    
 

También un enfoque similar descrito en Leer el cuerpo de la solicitud dos veces SO post


Actualizar: enfoque anterior en ReadBodyAsString with funcionará si se usa en middleware, no en el filtro de acción. La diferencia es que cuando el filtro de acción está llamando (incluso para OnActionExecuting), el flujo del cuerpo ya se ha leído y [FromBody] model ha sido poblado.

Lo bueno es que, por lo tanto, es posible obtener el modelo directamente en el filtro de acción mediante el uso de context.ActionArguments[""]. En tu caso:

public void OnActionExecuted(ActionExecutedContext context)

   var model = context.ActionArguments["model"] as NoteModel;

El siguiente fragmento funcionó para mí, para registrar la solicitud solo si hay alguna excepción. (. Net Core 3.1)

public class ExceptionFilter : IActionFilter

    private ConcurrentDictionary requests = new ConcurrentDictionary();

    public void OnActionExecuted(ActionExecutedContext context)
    
        if (context.Exception != null)

        
            StringBuilder parameters = new StringBuilder();

            _logger.LogError("Error while executing action:" + context.ActionDescriptor.DisplayName);

            string errRequest;
            if(requests.TryGetValue(context.HttpContext.TraceIdentifier,out errRequest))
            
                _logger.LogError(errRequest);
            

            _logger.LogError(context.Exception);

            context.Result = new ObjectResult("Error!!!")
            
                StatusCode = 500,
            ;
            context.ExceptionHandled = true;
        

        string req;
            requests.Remove(context.HttpContext.TraceIdentifier, out req);


    

    public void OnActionExecuting(ActionExecutingContext context)
    
        StringBuilder sb = new StringBuilder();
        foreach (var arg in context.ActionArguments)
        

            sb.Append(arg.Key.ToString() + ":" + Newtonsoft.Json.JsonConvert.SerializeObject(arg.Value) + "n");

        
        requests.TryAdd(context.HttpContext.TraceIdentifier, sb.ToString());
    



Puedes añadir valor a nuestra información contribuyendo tu experiencia en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *