0

如题,能否获取到请求参数?

我尝试从请求正文中获取它,但失败了,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));
            }
         }
     }
}
4

1 回答 1

1

请求正文被消耗并且在 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);
        }

}
于 2020-08-04T07:42:44.450 回答