当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET Web API IExceptionLogger调用了两次

如何解决《ASP.NETWebAPIIExceptionLogger调用了两次》经验,为你挑选了1个好方法。

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

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

这会返回一个条目,所以我确定只注册了一个记录器实例.我不希望我的未处理异常被记录两次,我不认为这是预期的默认行为.我如何解决导致它的原因?

如果我在LogAsync()方法中设置断点,则callstack会[External Code]在两个调用中显示.

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

记录器注入如下:

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

public class WebApiExceptionLogger : IExceptionLogger
{
    private readonly ILoggingService loggingService;

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

    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);
    }
}

Oskar Sjöber.. 8

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

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



1> Oskar Sjöber..:

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

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

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有