中间件是一种方法,或者您也可以创建一个过滤器,让您执行“之前”和“之后”操作,
https://www.tutorialsteacher.com/webapi/web-api-filters
[来自上述链接的代码]
public class LogDemoAttribute : Attribute, IActionFilter
{
public LogDemoAttribute()
{
}
public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
Trace.WriteLine(string.Format("Action Method {0} executing at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");
var result = await continuation();
Trace.WriteLine(string.Format("Action Method {0} executed at {1}", actionContext.ActionDescriptor.ActionName, DateTime.Now.ToShortDateString()), "Web API Logs");
return result;
}
public bool AllowMultiple
{
get { return true; }
}
}
这确实让您可以添加到全局过滤器(在这种情况下,您不妨使用中间件),或有选择地将其添加到某些端点,例如
[ApiController]
public class PeopleController : ControllerBase
{
[LogDemo]
[HttpGet("demo/endpoint")]
public IActionResult GetAll()
{
}
}
这样做的好处是您可能希望将一些参数传递给属性,以便您执行某些特定于上下文的行为。
如果您想将日志记录添加到非控制器代码中,那么您可以将此方法进一步用于面向方面/装饰器模式。
https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/february/aspect-oriented-programming-aspect-oriented-programming-with-the-realproxy-class
我通常发现控制器级别的日志记录参数已经足够好,像 Application Insights 这样生成遥测数据的东西,它可以向您显示请求的样子实际上是有用的信息。