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.