gpt4 book ai didi

c# - ASP.NET Core 过滤器 - 忽略已定义的方法

转载 作者:行者123 更新时间:2023-11-30 13:43:56 25 4
gpt4 key购买 nike

我们将日志信息记录到我们的数据库中。我将为它使用过滤器 (IActionFilter) 功能。我写了下面的类:

public class ActionFilter: Attribute, IActionFilter
{
DateTime start;
public void OnActionExecuting(ActionExecutingContext context)
{
start = DateTime.Now;
}

public void OnActionExecuted(ActionExecutedContext context)
{
DateTime end = DateTime.Now;
double processTime = end.Subtract(start).TotalMilliseconds;
... some log actions
}
}

然后我将以下代码添加到 Startup.cs:

services.AddMvc(options => {
options.Filters.Add(typeof(ActionFilter));

});

它工作正常。我在 ActionFilter 中为我的每个方法设置了断点。

但是我想忽略大部分方法的记录。据我了解,我可以用自己的属性来做到这一点。我以前没有使用自己的属性。好的,我写了以下属性:

public class IgnoreAttribute : Attribute
{
public IgnoreAttribute()
{ }
}

我将属性添加到方法中:

[Ignore]
[HttpGet]
[Route("api/AppovedTransactionAmountByDays/{daysCount}")]
public JsonResult GetAppovedTransactionAmountByDays(int daysCount)
{
var result = daysCount;

return new JsonResult(result);
}

当然,简单的操作是行不通的。

我必须如何更改我的属性或我的 ActionFilter 以忽略方法?

提前致谢。

最佳答案

felix-b 关于命名的说明是一个很好的。

我想再做一个说明。以这种方式注册时,不应将状态存储在过滤器中。既然是属性,就只实例化一次!所以你在那里有一个巨大的竞争条件。一种选择是使用:

services.AddMvc(o =>
{
o.Filters.Add(new ServiceFilterAttribute(typeof(LoggingActionFilter)));
});

并将其注册为 transient :

services.AddTransient<LoggingActionFilter>();

现在每次需要时都会实例化该属性,因此您可以安全地存储状态。

如果 marker 属性存在,配置它以便忽略操作也是可能的:

public class LoggingActionFilter : Attribute, IActionFilter
{
private DateTime start;
private bool skipLogging = false;

public void OnActionExecuting(ActionExecutingContext context)
{
var descriptor = (ControllerActionDescriptor)context.ActionDescriptor;
var attributes = descriptor.MethodInfo.CustomAttributes;

if (attributes.Any(a => a.AttributeType == typeof(SkipLoggingAttribute)))
{
skipLogging = true;
return;
}

start = DateTime.Now;
}

public void OnActionExecuted(ActionExecutedContext context)
{
if (skipLogging)
{
return;
}

DateTime end = DateTime.Now;
double processTime = end.Subtract(start).TotalMilliseconds;
}
}

public class SkipLoggingAttribute : Attribute
{
}

在这里,我们从参数中获取可用的操作描述符,并查找相关方法是否具有 SkipLogging 属性。如果是,则跳过日志记录代码。

关于c# - ASP.NET Core 过滤器 - 忽略已定义的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48545294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com