gpt4 book ai didi

.net - ASP.NET Web API IExceptionLogger 调用两次

转载 作者:行者123 更新时间:2023-12-02 15:43:30 26 4
gpt4 key购买 nike

当 Controller 操作抛出异常时,我的异常记录器实现 [IExceptionLogger][1] 被调用两次。

context.RequestContext.Configuration.Services.GetServices(typeof(IExceptionLogger))

这会返回一个条目,因此我确定只注册了一个记录器实例。我不希望未处理的异常被记录两次,并且我不认为这是预期的默认行为。如何排除导致该问题的原因?

如果我在 LogAsync() 方法中设置断点,调用堆栈会在两次调用中显示 [External Code]

[RoutePrefix("test")]
public class MyController : ApiController
{
[HttpGet, AllowAnonymous]
[Route("test")]
public string GetTest()
{
throw new InvalidOperationException("Shit happens");
}
}

记录器是这样注入(inject)的:

config.Services.Add(typeof(IExceptionLogger), new WebApiExceptionLogger());

public class WebApiExceptionLogger : IExceptionLogger
{
private readonly ILoggingService loggingService;

public WebApiExceptionLogger()
{
this.loggingService = ServiceContainer.Factory.Resolve<ILoggingService>();
}

public Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken)
{
this.loggingService.Log(LogLevel.Error, this.GetType().Name, context.Exception, "Ship has just happened");
return Task.FromResult(true);
}
}

最佳答案

尝试更改 WebApiExceptionLogger,使其继承自 ExceptionLogger。 ExceptionLogger 实现了一个名为“ShouldLog”的自定义方法,该方法可以抑制重复调用。 (除非您可以提供类似的逻辑,否则您不应重写此方法)。这为我解决了这个问题。

我认为这种行为是因为当管道中的不同位置发生异常时,WebApi2 会为每个请求调用 Log/LogAsync 两次。除非你有逻辑来处理这个问题,否则你最终会得到重复的日志调用。

关于.net - ASP.NET Web API IExceptionLogger 调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41870954/

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