如何在action过滤器的OnActionExecuted中获取请求参数

Rya*_*ule 1 parameters request action-filter onactionexecuted .net-core

如标题,是否可以获取请求参数?

我尝试从请求正文中获取它,但失败了,task.Result为零。看来请求正文是空的。

任何人都可以帮助我,我将不胜感激。

代码如下:

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));
            }
         }
     }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

请求正文已被消耗并且在 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 "";
}
Run Code Online (Sandbox Code Playgroud)

读取已存储在 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);
        }

}
Run Code Online (Sandbox Code Playgroud)