Dot-Net

ASP.NET Web API IExceptionLogger 呼叫了兩次

  • July 20, 2017

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

記錄器是這樣注入的:

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 兩次。除非您有處理此問題的邏輯,否則您最終會遇到重複的日誌呼叫。

引用自:https://stackoverflow.com/questions/41870954