Browse Source

Improve localization, add BusinessException

pull/279/head
Halil İbrahim Kalkan 9 years ago
parent
commit
c317560a06
  1. 9
      src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs
  2. 9
      src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs
  3. 7
      src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/HttpExceptionStatusCodeFinder.cs
  4. 22
      src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Http/HttpRequestExtensions.cs
  5. 28
      src/Volo.Abp.Core/Volo/Abp/BusinessException.cs
  6. 2
      src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorCode.cs
  7. 7
      src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorDetails.cs
  8. 9
      src/Volo.Abp.Core/Volo/Abp/IBusinessException.cs
  9. 18
      src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceExtensions.cs
  10. 28
      src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceListExtensions.cs
  11. 10
      src/Volo.Abp.UI/Volo/Abp/Ui/IUserFriendlyException.cs
  12. 1
      src/Volo.Abp.UI/Volo/Abp/Ui/UserFriendlyException.cs

9
src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs

@ -1,4 +1,5 @@
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
@ -47,8 +48,12 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
return true; return true;
} }
var accept = context.HttpContext.Request.Headers["Accept"]; if (context.HttpContext.Request.Headers["Accept"].ToString().Contains("application/json")) //TODO: Optimize?
if (accept.ToString().Contains("application/json")) //TODO: Optimize {
return true;
}
if (context.HttpContext.Request.IsAjax())
{ {
return true; return true;
} }

9
src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs

@ -5,6 +5,7 @@ using System.Text;
using Volo.Abp.Authorization; using Volo.Abp.Authorization;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Http; using Volo.Abp.Http;
using Volo.Abp.UI; using Volo.Abp.UI;
using Volo.Abp.Validation; using Volo.Abp.Validation;
@ -52,7 +53,7 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
if (exception is IUserFriendlyException) if (exception is IUserFriendlyException)
{ {
var userFriendlyException = exception as IUserFriendlyException; var userFriendlyException = exception as IUserFriendlyException;
errorInfo.Message = userFriendlyException.Message; errorInfo.Message = exception.Message;
errorInfo.Details = userFriendlyException.Details; errorInfo.Details = userFriendlyException.Details;
} }
@ -71,6 +72,12 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
errorInfo.ValidationErrors = GetValidationErrorInfos(exception as IHasValidationErrors); errorInfo.ValidationErrors = GetValidationErrorInfos(exception as IHasValidationErrors);
} }
//TODO: For test purpose
if (exception is IBusinessException)
{
errorInfo.Message = (exception as IBusinessException).Code;
}
if (errorInfo.Message.IsNullOrEmpty()) if (errorInfo.Message.IsNullOrEmpty())
{ {
errorInfo.Message = L("InternalServerError"); errorInfo.Message = L("InternalServerError");

7
src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/HttpExceptionStatusCodeFinder.cs

@ -12,6 +12,8 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
{ {
public virtual int GetStatusCode(HttpContext httpContext, Exception exception) public virtual int GetStatusCode(HttpContext httpContext, Exception exception)
{ {
//TODO: If the exception has error code than we can determine the exception from it!
if (exception is AbpAuthorizationException) if (exception is AbpAuthorizationException)
{ {
return httpContext.User.Identity.IsAuthenticated return httpContext.User.Identity.IsAuthenticated
@ -29,6 +31,11 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
return (int)HttpStatusCode.NotFound; return (int)HttpStatusCode.NotFound;
} }
if (exception is IBusinessException)
{
return (int)HttpStatusCode.Forbidden;
}
return (int)HttpStatusCode.InternalServerError; return (int)HttpStatusCode.InternalServerError;
} }
} }

22
src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Http/HttpRequestExtensions.cs

@ -0,0 +1,22 @@
using Volo.Abp;
namespace Microsoft.AspNetCore.Http
{
public static class HttpRequestExtensions
{
private const string RequestedWithHeader = "X-Requested-With";
private const string XmlHttpRequest = "XMLHttpRequest";
public static bool IsAjax(this HttpRequest request)
{
Check.NotNull(request, nameof(request));
if (request.Headers == null)
{
return false;
}
return request.Headers[RequestedWithHeader] == XmlHttpRequest;
}
}
}

28
src/Volo.Abp.Core/Volo/Abp/BusinessException.cs

@ -0,0 +1,28 @@
using System;
using Microsoft.Extensions.Logging;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Logging;
namespace Volo.Abp
{
public class BusinessException : Exception, IBusinessException, IHasErrorDetails, IHasLogLevel
{
public string Code { get; set; }
public string Details { get; set; }
public LogLevel LogLevel { get; set; } = LogLevel.Warning;
public BusinessException()
{
}
public BusinessException(string code, string message = null, string details = null)
: base(message)
{
Code = code;
Details = details;
}
}
}

2
src/Volo.Abp.Core/Volo/Abp/IHasErrorCode.cs → src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorCode.cs

@ -1,4 +1,4 @@
namespace Volo.Abp namespace Volo.Abp.ExceptionHandling
{ {
public interface IHasErrorCode public interface IHasErrorCode
{ {

7
src/Volo.Abp.Core/Volo/Abp/ExceptionHandling/IHasErrorDetails.cs

@ -0,0 +1,7 @@
namespace Volo.Abp.ExceptionHandling
{
public interface IHasErrorDetails
{
string Details { get; set; }
}
}

9
src/Volo.Abp.Core/Volo/Abp/IBusinessException.cs

@ -0,0 +1,9 @@
using Volo.Abp.ExceptionHandling;
namespace Volo.Abp
{
public interface IBusinessException : IHasErrorCode
{
}
}

18
src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceExtensions.cs

@ -1,18 +0,0 @@
using System;
using JetBrains.Annotations;
namespace Volo.Abp.Localization
{
public static class LocalizationResourceExtensions
{
public static LocalizationResource InheritFrom([NotNull] this LocalizationResource resource, [NotNull] params Type[] baseResourceTypes)
{
Check.NotNull(resource, nameof(resource));
Check.NotNull(baseResourceTypes, nameof(baseResourceTypes));
resource.BaseResourceTypes.AddRange(baseResourceTypes);
return resource;
}
}
}

28
src/Volo.Abp.Localization/Volo/Abp/Localization/LocalizationResourceListExtensions.cs

@ -40,6 +40,30 @@ namespace Volo.Abp.Localization
{ {
Check.NotNull(resourceDictionary, nameof(resourceDictionary)); Check.NotNull(resourceDictionary, nameof(resourceDictionary));
GetResource<TResource>(resourceDictionary).Extensions.Add(
new JsonEmbeddedFileLocalizationDictionaryProvider(
virtualPath
)
);
}
public static void AddBaseTypes<TResource>(
[NotNull] this LocalizationResourceDictionary resourceDictionary,
[NotNull] params Type[] types)
{
Check.NotNull(resourceDictionary, nameof(resourceDictionary));
Check.NotNull(types, nameof(types));
var resource = GetResource<TResource>(resourceDictionary);
foreach (var type in types)
{
resource.BaseResourceTypes.AddIfNotContains(type);
}
}
private static LocalizationResource GetResource<TResource>(LocalizationResourceDictionary resourceDictionary)
{
var resourceType = typeof(TResource); var resourceType = typeof(TResource);
var resource = resourceDictionary.GetOrDefault(resourceType); var resource = resourceDictionary.GetOrDefault(resourceType);
@ -48,9 +72,7 @@ namespace Volo.Abp.Localization
throw new AbpException("Can not find a resource with given type: " + resourceType.AssemblyQualifiedName); throw new AbpException("Can not find a resource with given type: " + resourceType.AssemblyQualifiedName);
} }
resource.Extensions.Add(new JsonEmbeddedFileLocalizationDictionaryProvider( return resource;
virtualPath
));
} }
} }
} }

10
src/Volo.Abp.UI/Volo/Abp/Ui/IUserFriendlyException.cs

@ -1,13 +1,9 @@
using Volo.Abp.ExceptionHandling;
namespace Volo.Abp.UI namespace Volo.Abp.UI
{ {
/* TODO: public interface IUserFriendlyException : IHasErrorDetails
* - define an interface to split Details, like IHasExceptionDetails
*/
public interface IUserFriendlyException
{ {
string Message { get; }
string Details { get; set; }
} }
} }

1
src/Volo.Abp.UI/Volo/Abp/Ui/UserFriendlyException.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.Logging; using Volo.Abp.Logging;
namespace Volo.Abp.UI namespace Volo.Abp.UI

Loading…
Cancel
Save