ASP.NET Core模型绑定程序结果记录

时间:2019-05-07 14:16:03

标签: c# asp.net-core .net-core asp.net-core-2.2 .net-core-2.2

我想增加/改善日志记录。

到目前为止,我在每个控制器动作代码中都有

  public asyc Task<IActionResult> Action1(int id, [FromBody] RequestModel request) {
    string log = $"{nameof(Action1)}(id: {id}, request: {request?.ToJson()})";
    _logger.LogInformation(log);

主要目的是查看实际达到控制器动作的内容。

我删除了它,因为它使代码很混乱(例如,对于具有很多参数的方法)。但是现在我对日志不再显示信息的结果感到不满意(我需要它们来研究一些无法解释的错误)。

是否有一种方法可以挂接到模型绑定程序结果(例如,通过服务过滤器)以记录模型绑定程序结果?

1 个答案:

答案 0 :(得分:0)

我认为您可以改用ActionFilter。在模型绑定之后执行ActionFilter,因此您可以从ActionExecutingContext中检索参数。您可以覆盖OnActionExecuting方法并记录所需的内容:

public class LogParamsFilter : ActionFilterAttribute
{
    private readonly ILogger<LogsParamsFilter> _logger;

    public LogParamsFilter (ILogger<LogsParamsFilter> logger)
    {
        _logger = logger;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var id = (int)context.ActionArguments["id"];
        var request = context.ActionArguments["request"] as RequestModel;
        var action = context.ActionDescriptor.DisplayName;

        string log = $"{action)}(id: {id}, request: {request?.ToJson()})";
        _logger.LogInformation(log);

        base.OnActionExecuting(context);
    }
}

您需要在控制器操作上将其用作TypeFilter,以使其具有依赖性,即ILogger通过DI解析。

[TypeFilter(typeof(LogParamsFilter))]
public asyc Task<IActionResult> Action1(int id, [FromBody] RequestModel request)
{
    ...
}

或者您可以在启动时为所有控制器全局注册它:

services.AddMvc(options => options
    .Filters.Add(new TypeFilterAttribute(typeof(LogParamsFilter))));

为了将其用作所有控制器操作的通用过滤器,请遍历context.ActionArguments.Keys属性并记录每个键的值。如果.ToJson()的类型是RequestModel,则需要进行一些类型检查并调用ActionArgument

我希望有帮助。