Как получить параметр запроса в OnActionExecuted фильтра действий - PullRequest
0 голосов
/ 04 августа 2020

Как заголовок, можно ли получить параметр запроса?

Я пытаюсь получить его из тела запроса, но не удалось, задача . Результат равен нулю. кажется, что тело запроса пусто.

Кто-нибудь может мне помочь, это будет очень важно.

Код, как показано ниже:

public class LogFilter : Attribute, IActionFilter  
{
     private ILogger<LogFilter> _logger;
     private ITestAService _service;

     public LogFilter(ILogger<LogFilter> logger, ITestAService service)
     {
          _logger = logger;
          _service = service;
     }

     public void OnActionExecuted(ActionExecutedContext context)
     {
         var content = new StringBuilder();
         using (Stream sm = context.HttpContext.Request.Body)
         {
            int count = 0;
            byte[] buffer = new byte[1024];
            StringBuilder builder = new StringBuilder();
            var task = sm.ReadAsync(buffer, 0, 1024);
            if (task.Result > 0)
            {
                content.Append(Encoding.UTF8.GetString(buffer, 0, count));
            }
         }
     }
}

1 Ответ

1 голос
/ 04 августа 2020

Тело запроса потреблено и недоступно в OnActionExecuted, я делаю это так:

Прочтите тело запроса и сохраните его HTTPContext

public void OnActionExecuting(ActionExecutingContext context)
{
        try
        {
            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;

            if (controllerActionDescriptor != null)
            {
                    var requestBody = FormatRequestBody(context.ActionArguments);
                    context.HttpContext.Items["LogRequestBody"] = requestBody;
            }
        }
        catch (Exception ex)
        {
            _logger.Error("Error in LogServiceCallFilter", ex);
        }
}


public string FormatRequestBody(IDictionary<string, object> actionArguments)
{
        try
        {

            if (actionArguments != null)
                return $"{JsonConvert.SerializeObject(actionArguments)}";
        }
        catch (Exception ex)
        {
            _logger.Error("Error in LogServiceCallFilter", ex);
        }
        return "";
}

Прочтите тело запроса, которое вы уже сохранили в HttpContext

public void OnActionExecuted(ActionExecutedContext context)
{
        try
        {
            var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;

            if (controllerActionDescriptor != null)
            {
                    var actionName = context.ActionDescriptor.RouteValues["controller"] + "/" + context.ActionDescriptor.RouteValues["action"];
                    var requestBody = context.HttpContext.Items["LogRequestBody"] != null ? context.HttpContext.Items["LogRequestBody"].ToString() : "";
                    context.HttpContext.Items.Remove("LogRequestBody");
            }
        }
        catch (Exception ex)
        {
            _logger.Error("Error in LogServiceCallFilter", ex);
        }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...