如何在动作过滤器的OnActionExecuted中获取请求参数
How to get request parameter in OnActionExecuted of action filter
如题,请求参数是否可以获取?
我尝试从请求正文中获取它,但失败了,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));
}
}
}
}
Request Body在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);
}
}
如题,请求参数是否可以获取?
我尝试从请求正文中获取它,但失败了,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));
}
}
}
}
Request Body在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);
}
}