Browse Source

Show message to the user instead of bottom error line.

pull/5706/head
Halil İbrahim Kalkan 5 years ago
parent
commit
9d12427545
  1. 1
      .gitignore
  2. 17
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Microsoft/Extensions/DependencyInjection/AbpWebAssemblyServiceCollectionExtensions.cs
  3. 9
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpAspNetCoreComponentsWebAssemblyModule.cs
  4. 70
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLogger.cs
  5. 38
      framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/ExceptionHandling/AbpExceptionHandlingLoggerProvider.cs
  6. 9
      framework/src/Volo.Abp.Core/Microsoft/Extensions/DependencyInjection/ServiceCollectionCommonExtensions.cs
  7. 5
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html

1
.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/

17
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<WebAssemblyHostBuilder>();
}
}
}

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

70
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<TState>(
LogLevel logLevel,
EventId eventId,
TState state,
Exception exception,
Func<TState, Exception, string> 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<IUiMessageService>();
}
public bool IsEnabled(LogLevel logLevel)
{
return logLevel == LogLevel.Critical || logLevel == LogLevel.Error;
}
public IDisposable BeginScope<TState>(TState state)
{
return NullDisposable.Instance;
}
public void Dispose()
{
_serviceScope?.Dispose();
}
}
}

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

9
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<T>(this IServiceCollection services)
{
var service = services.GetSingletonInstanceOrNull<T>();
@ -165,5 +165,10 @@ namespace Microsoft.Extensions.DependencyInjection
{
return new Lazy<object>(() => services.GetRequiredService(type), true);
}
public static IServiceProvider GetServiceProviderOrNull(this IServiceCollection services)
{
return services.GetObjectOrNull<IServiceProvider>();
}
}
}
}

5
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/index.html

@ -19,11 +19,6 @@
<body class="abp-application-layout bg-light">
<app>Loading...</app>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>
<script src="_content/Microsoft.AspNetCore.Components.WebAssembly.Authentication/AuthenticationService.js"></script>
<script src="_framework/blazor.webassembly.js"></script>

Loading…
Cancel
Save