Dot-Net
ASP.NET Web API IExceptionLogger 呼叫了兩次
[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 兩次。除非您有處理此問題的邏輯,否則您最終會遇到重複的日誌呼叫。