diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs index 9f84feae1d..88aa4749ad 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs @@ -111,7 +111,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling var codeNamespace = exceptionWithErrorCode.Code.Split(':')[0]; - var localizationResourceType = _localizationOptions.CodeNamespaceMappings.GetOrDefault(codeNamespace); + var localizationResourceType = _localizationOptions.ErrorCodeNamespaceMappings.GetOrDefault(codeNamespace); if (localizationResourceType == null) { return; diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultHttpExceptionStatusCodeFinder.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultHttpExceptionStatusCodeFinder.cs index 15ab80378e..445ecf3884 100644 --- a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultHttpExceptionStatusCodeFinder.cs +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultHttpExceptionStatusCodeFinder.cs @@ -1,19 +1,39 @@ using System; +using System.Collections.Generic; using System.Net; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Options; using Volo.Abp.Authorization; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Entities; +using Volo.Abp.ExceptionHandling; using Volo.Abp.Validation; namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling { public class DefaultHttpExceptionStatusCodeFinder : IHttpExceptionStatusCodeFinder, ITransientDependency { + protected ExceptionHttpStatusCodeOptions Options { get; } + + public DefaultHttpExceptionStatusCodeFinder( + IOptions options) + { + Options = options.Value; + } + public virtual HttpStatusCode GetStatusCode(HttpContext httpContext, Exception exception) { //TODO: If the exception has error code than we can determine the exception from it! + if (exception is IHasErrorCode exceptionWithErrorCode && + !exceptionWithErrorCode.Code.IsNullOrWhiteSpace()) + { + if (Options.ErrorCodeToHttpStatusCodeMappings.TryGetValue(exceptionWithErrorCode.Code, out var status)) + { + return status; + } + } + if (exception is AbpAuthorizationException) { return httpContext.User.Identity.IsAuthenticated diff --git a/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/ExceptionHttpStatusCodeOptions.cs b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/ExceptionHttpStatusCodeOptions.cs new file mode 100644 index 0000000000..b987eb4073 --- /dev/null +++ b/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/ExceptionHttpStatusCodeOptions.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using System.Net; + +namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling +{ + public class ExceptionHttpStatusCodeOptions + { + public IDictionary ErrorCodeToHttpStatusCodeMappings { get; } + + public ExceptionHttpStatusCodeOptions() + { + ErrorCodeToHttpStatusCodeMappings = new Dictionary(); + } + + public void Map(string errorCode, HttpStatusCode httpStatusCode) + { + ErrorCodeToHttpStatusCodeMappings[errorCode] = httpStatusCode; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.Localization/Volo/Abp/Localization/ExceptionHandling/ExceptionLocalizationOptions.cs b/src/Volo.Abp.Localization/Volo/Abp/Localization/ExceptionHandling/ExceptionLocalizationOptions.cs index 8418d45325..1105b7146c 100644 --- a/src/Volo.Abp.Localization/Volo/Abp/Localization/ExceptionHandling/ExceptionLocalizationOptions.cs +++ b/src/Volo.Abp.Localization/Volo/Abp/Localization/ExceptionHandling/ExceptionLocalizationOptions.cs @@ -5,16 +5,16 @@ namespace Volo.Abp.Localization.ExceptionHandling { public class ExceptionLocalizationOptions { - public Dictionary CodeNamespaceMappings { get; } + public Dictionary ErrorCodeNamespaceMappings { get; } public ExceptionLocalizationOptions() { - CodeNamespaceMappings = new Dictionary(); + ErrorCodeNamespaceMappings = new Dictionary(); } - public void MapCodeNamespace(string codeNamespace, Type type) + public void MapCodeNamespace(string errorCodeNamespace, Type type) { - CodeNamespaceMappings[codeNamespace] = type; + ErrorCodeNamespaceMappings[errorCodeNamespace] = type; } } }