From 9d12427545c5754cb9f1960495434e44e05af35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 5 Oct 2020 12:09:57 +0300 Subject: [PATCH] Show message to the user instead of bottom error line. --- .gitignore | 1 + ...pWebAssemblyServiceCollectionExtensions.cs | 17 +++++ ...bpAspNetCoreComponentsWebAssemblyModule.cs | 9 +++ .../AbpExceptionHandlingLogger.cs | 70 +++++++++++++++++++ .../AbpExceptionHandlingLoggerProvider.cs | 38 ++++++++++ .../ServiceCollectionCommonExtensions.cs | 9 ++- .../wwwroot/index.html | 5 -- 7 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs diff --git a/.gitignore b/.gitignore index 5b47e32794..6e767c8f76 100644 --- a/.gitignore +++ b/.gitignore @@ -304,3 +304,4 @@ modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Logs/ /templates/app/angular/package-lock.json /modules/client-simulation/demo/Volo.ClientSimulation.Demo/package-lock.json abp-build-config.json +/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/Test/ diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs new file mode 100644 index 0000000000..2f541265d1 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs @@ -0,0 +1,17 @@ +using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Volo.Abp; + +namespace Microsoft.Extensions.DependencyInjection +{ + public static class AbpWebAssemblyServiceCollectionExtensions + { + public static WebAssemblyHostBuilder GetHostBuilder( + [NotNull] this IServiceCollection services) + { + Check.NotNull(services, nameof(services)); + + return services.GetSingletonInstance(); + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs index db6109e55a..707952f7c4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs @@ -1,4 +1,6 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling; using Volo.Abp.AspNetCore.Mvc.Client; using Volo.Abp.Http.Client; using Volo.Abp.Modularity; @@ -22,5 +24,12 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly }); }); } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services + .GetHostBuilder().Logging + .AddProvider(new AbpExceptionHandlingLoggerProvider(context.Services)); + } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs new file mode 100644 index 0000000000..896031aaaf --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs @@ -0,0 +1,70 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling +{ + public class AbpExceptionHandlingLogger : ILogger, IDisposable + { + private readonly IServiceCollection _serviceCollection; + private IServiceScope _serviceScope; + private IUiMessageService _messageService; + + public AbpExceptionHandlingLogger(IServiceCollection serviceCollection) + { + _serviceCollection = serviceCollection; + } + + public void Log( + LogLevel logLevel, + EventId eventId, + TState state, + Exception exception, + Func formatter) + { + if (logLevel != LogLevel.Critical && logLevel != LogLevel.Error) + { + return; + } + + TryInitialize(); + + if (_messageService == null) + { + return; + } + + //TODO: handle exception types + _messageService.ErrorAsync( + exception?.Message ?? state?.ToString() ?? "Unknown error!" + ); + } + + private void TryInitialize() + { + var serviceProvider = _serviceCollection.GetServiceProviderOrNull(); + if (serviceProvider == null) + { + return; + } + + _serviceScope = serviceProvider.CreateScope(); + _messageService = _serviceScope.ServiceProvider.GetRequiredService(); + } + + public bool IsEnabled(LogLevel logLevel) + { + return logLevel == LogLevel.Critical || logLevel == LogLevel.Error; + } + + public IDisposable BeginScope(TState state) + { + return NullDisposable.Instance; + } + + public void Dispose() + { + _serviceScope?.Dispose(); + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs new file mode 100644 index 0000000000..d295559284 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs @@ -0,0 +1,38 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Volo.Abp.AspNetCore.Components.WebAssembly.ExceptionHandling +{ + public class AbpExceptionHandlingLoggerProvider : ILoggerProvider + { + private AbpExceptionHandlingLogger _logger; + private static readonly object SyncObj = new object(); + private readonly IServiceCollection _serviceCollection; + + public AbpExceptionHandlingLoggerProvider(IServiceCollection serviceCollection) + { + _serviceCollection = serviceCollection; + } + + public ILogger CreateLogger(string categoryName) + { + if (_logger == null) + { + lock (SyncObj) + { + if (_logger == null) + { + _logger = new AbpExceptionHandlingLogger(_serviceCollection); + } + } + } + + return _logger; + } + + public void Dispose() + { + _logger.Dispose(); + } + } +} diff --git a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs index 1b2d2c4652..88e73c67e8 100644 --- a/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs +++ b/framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs @@ -24,7 +24,7 @@ namespace Microsoft.Extensions.DependencyInjection .FirstOrDefault(d => d.ServiceType == typeof(T)) ?.ImplementationInstance; } - + public static T GetSingletonInstance(this IServiceCollection services) { var service = services.GetSingletonInstanceOrNull(); @@ -165,5 +165,10 @@ namespace Microsoft.Extensions.DependencyInjection { return new Lazy(() => services.GetRequiredService(type), true); } + + public static IServiceProvider GetServiceProviderOrNull(this IServiceCollection services) + { + return services.GetObjectOrNull(); + } } -} \ No newline at end of file +} diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html index 9edbaa4185..4566bec3c1 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html @@ -19,11 +19,6 @@ Loading... -
- An unhandled error has occurred. - Reload - 🗙 -