Skip to content

Commit ee2f86d

Browse files
authored
Merge pull request #25477 from abpframework/auto-merge/rel-10-4/4583
Merge branch dev with rel-10.4
2 parents 68b1135 + 4265df0 commit ee2f86d

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ public override void ConfigureServices(ServiceConfigurationContext context)
4848
context.Services.AddHttpClient();
4949
context.Services
5050
.GetHostBuilder().Logging
51-
.AddProvider(new AbpExceptionHandlingLoggerProvider(context.Services));
51+
.AddProvider(new AbpExceptionHandlingLoggerProvider(context.Services))
52+
.AddFilter<AbpExceptionHandlingLoggerProvider>(typeof(UserExceptionInformer).FullName, LogLevel.None);
5253

5354
if (!context.Services.ExecutePreConfiguredActions<AbpAspNetCoreComponentsWebOptions>().IsBlazorWebApp)
5455
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Microsoft.Extensions.DependencyInjection;
4+
using Microsoft.Extensions.Logging;
5+
using Shouldly;
6+
using Volo.Abp.AspNetCore.Components.ExceptionHandling;
7+
using Xunit;
8+
9+
namespace Volo.Abp.AspNetCore.Components.Web.ExceptionHandling;
10+
11+
public class AbpExceptionHandlingLogger_Tests
12+
{
13+
[Fact]
14+
public void Should_Not_Recurse_When_Informer_Writes_To_Same_Logger_Pipeline()
15+
{
16+
var services = new ServiceCollection();
17+
var informer = new RecordingUserExceptionInformer();
18+
services.AddSingleton<IUserExceptionInformer>(informer);
19+
20+
var provider = new AbpExceptionHandlingLoggerProvider(services);
21+
services.AddLogging(builder => builder
22+
.AddProvider(provider)
23+
.AddFilter<AbpExceptionHandlingLoggerProvider>(typeof(UserExceptionInformer).FullName, LogLevel.None));
24+
25+
var accessor = services.AddObjectAccessor<IServiceProvider>();
26+
var sp = services.BuildServiceProvider();
27+
accessor.Value = sp;
28+
29+
informer.Logger = sp.GetRequiredService<ILoggerFactory>()
30+
.CreateLogger(typeof(UserExceptionInformer).FullName!);
31+
32+
var entryLogger = sp.GetRequiredService<ILogger<AbpExceptionHandlingLogger_Tests>>();
33+
entryLogger.LogError(new InvalidOperationException("boom"), "entry");
34+
35+
informer.InformCalls.ShouldBe(1);
36+
}
37+
38+
private sealed class RecordingUserExceptionInformer : IUserExceptionInformer
39+
{
40+
private const int RecursionCircuitBreaker = 50;
41+
42+
public int InformCalls;
43+
public ILogger? Logger;
44+
45+
public void Inform(UserExceptionInformerContext context)
46+
{
47+
InformCalls++;
48+
if (InformCalls > RecursionCircuitBreaker)
49+
{
50+
return;
51+
}
52+
53+
Logger?.LogError(context.Exception, context.Exception.Message);
54+
}
55+
56+
public Task InformAsync(UserExceptionInformerContext context)
57+
{
58+
Inform(context);
59+
return Task.CompletedTask;
60+
}
61+
}
62+
}

0 commit comments

Comments
 (0)