14 changed files with 244 additions and 156 deletions
@ -1,10 +1,10 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<configuration> |
|||
<config> |
|||
<add key="yhglobal" value="https://proget.yhglobal.cn/nuget/default/" /> |
|||
<add key="nuget" value="https://api.nuget.org/v3/index.json" /> |
|||
</config> |
|||
|
|||
<packageSources> |
|||
<add key="yhglobal" value="https://proget.yhglobal.cn/nuget/default/" /> |
|||
<add key="nuget" value="https://api.nuget.org/v3/index.json" /> |
|||
</packageSources> |
|||
</configuration> |
|||
@ -0,0 +1,129 @@ |
|||
using CompanyNameProjectName.Attributes; |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Microsoft.AspNetCore.Mvc.Abstractions; |
|||
using Microsoft.AspNetCore.Mvc.Filters; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Microsoft.Extensions.Logging; |
|||
using Microsoft.Extensions.Logging.Abstractions; |
|||
using Microsoft.Extensions.Options; |
|||
using System; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using Volo.Abp; |
|||
using Volo.Abp.AspNetCore.ExceptionHandling; |
|||
using Volo.Abp.Authorization; |
|||
using Volo.Abp.DependencyInjection; |
|||
using Volo.Abp.Domain.Entities; |
|||
using Volo.Abp.ExceptionHandling; |
|||
using Volo.Abp.Http; |
|||
using Volo.Abp.Json; |
|||
using Volo.Abp.Validation; |
|||
|
|||
|
|||
namespace CompanyNameProjectName.Extensions.Filters |
|||
{ |
|||
public class ResultExceptionFilter : IFilterMetadata, IAsyncExceptionFilter, ITransientDependency |
|||
{ |
|||
public ILogger<ResultExceptionFilter> Logger { get; set; } |
|||
|
|||
private readonly IExceptionToErrorInfoConverter _errorInfoConverter; |
|||
private readonly IHttpExceptionStatusCodeFinder _statusCodeFinder; |
|||
private readonly IJsonSerializer _jsonSerializer; |
|||
private readonly AbpExceptionHandlingOptions _exceptionHandlingOptions; |
|||
|
|||
public ResultExceptionFilter( |
|||
IExceptionToErrorInfoConverter errorInfoConverter, |
|||
IHttpExceptionStatusCodeFinder statusCodeFinder, |
|||
IJsonSerializer jsonSerializer, |
|||
IOptions<AbpExceptionHandlingOptions> exceptionHandlingOptions) |
|||
{ |
|||
_errorInfoConverter = errorInfoConverter; |
|||
_statusCodeFinder = statusCodeFinder; |
|||
_jsonSerializer = jsonSerializer; |
|||
_exceptionHandlingOptions = exceptionHandlingOptions.Value; |
|||
Logger = NullLogger<ResultExceptionFilter>.Instance; |
|||
} |
|||
|
|||
public async Task OnExceptionAsync(ExceptionContext context) |
|||
{ |
|||
if (!ShouldHandleException(context)) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
|
|||
await HandleAndWrapException(context); |
|||
} |
|||
|
|||
protected virtual bool ShouldHandleException(ExceptionContext context) |
|||
{ |
|||
if (context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.GetCustomAttributes(typeof(DontWrapResultAttribute), true).Any()) |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
if (context.ActionDescriptor.GetMethodInfo().GetCustomAttributes(typeof(DontWrapResultAttribute), true).Any()) |
|||
{ |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
protected virtual async Task HandleAndWrapException(ExceptionContext context) |
|||
{ |
|||
//TODO: Trigger an AbpExceptionHandled event or something like that.
|
|||
|
|||
context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true"); |
|||
var statusCode = (int)_statusCodeFinder.GetStatusCode(context.HttpContext, context.Exception); |
|||
context.HttpContext.Response.StatusCode = 200; |
|||
|
|||
var remoteServiceErrorInfo = _errorInfoConverter.Convert(context.Exception, _exceptionHandlingOptions.SendExceptionsDetailsToClients); |
|||
remoteServiceErrorInfo.Code = context.HttpContext.TraceIdentifier; |
|||
remoteServiceErrorInfo.Message = SimplifyMessage(context.Exception); |
|||
var result = new WrapResult<object>(); |
|||
result.SetFail(remoteServiceErrorInfo.Message); |
|||
|
|||
// HttpResponse
|
|||
context.Result = new ObjectResult(result); |
|||
|
|||
// 写日志
|
|||
var logLevel = context.Exception.GetLogLevel(); |
|||
var remoteServiceErrorInfoBuilder = new StringBuilder(); |
|||
remoteServiceErrorInfoBuilder.AppendLine($"---------- {nameof(RemoteServiceErrorInfo)} ----------"); |
|||
remoteServiceErrorInfoBuilder.AppendLine(_jsonSerializer.Serialize(remoteServiceErrorInfo, indented: true)); |
|||
Logger.LogWithLevel(logLevel, remoteServiceErrorInfoBuilder.ToString()); |
|||
Logger.LogException(context.Exception, logLevel); |
|||
|
|||
await context.HttpContext |
|||
.RequestServices |
|||
.GetRequiredService<IExceptionNotifier>() |
|||
.NotifyAsync( |
|||
new ExceptionNotificationContext(context.Exception) |
|||
); |
|||
|
|||
context.Exception = null; //Handled!
|
|||
} |
|||
|
|||
protected string SimplifyMessage(Exception error) |
|||
{ |
|||
string message = string.Empty; |
|||
switch (error) |
|||
{ |
|||
case AbpAuthorizationException e: |
|||
return message = "Authenticate failure!"; |
|||
case AbpValidationException e: |
|||
return message = "Request param validate failure!"; |
|||
case EntityNotFoundException e: |
|||
return message = "not found the entity!"; |
|||
case BusinessException e: |
|||
return message = $"{e.Message}"; |
|||
case NotImplementedException e: |
|||
return message = "not implement!"; |
|||
default: |
|||
return message = "server internal error!"; |
|||
} |
|||
} |
|||
} |
|||
|
|||
} |
|||
@ -1,61 +0,0 @@ |
|||
{ |
|||
"App": { |
|||
"SelfUrl": "https://localhost:44363", |
|||
"CorsOrigins": "https://*.CompanyNameProjectName.com,http://localhost:8083,http://localhost:8081,https://localhost:44307," |
|||
}, |
|||
"StringEncryption": { |
|||
"DefaultPassPhrase": "MY2bTgp2iaHUEp66" |
|||
}, |
|||
"Settings": { |
|||
"Abp.Mailing.Smtp.Host": "127.0.0.1", |
|||
"Abp.Mailing.Smtp.Port": "25", |
|||
"Abp.Mailing.Smtp.UserName": "", |
|||
"Abp.Mailing.Smtp.Password": "", |
|||
"Abp.Mailing.Smtp.Domain": "", |
|||
"Abp.Mailing.Smtp.EnableSsl": "false", |
|||
"Abp.Mailing.Smtp.UseDefaultCredentials": "true", |
|||
"Abp.Mailing.DefaultFromAddress": "noreply@abp.io", |
|||
"Abp.Mailing.DefaultFromDisplayName": "ABP application" |
|||
}, |
|||
"Serilog": { |
|||
"MinimumLevel": { |
|||
"Default": "Information", |
|||
"Override": { |
|||
"Microsoft": "Information", |
|||
"Microsoft.AspNetCore": "Information", |
|||
"System": "Warning", |
|||
"Microsoft.Hosting.Lifetime": "Information", |
|||
"Microsoft.AspNetCore.Routing": "Information", |
|||
"Microsoft.AspNetCore.Hosting.Diagnostics": "Error" |
|||
} |
|||
} |
|||
}, |
|||
"ConnectionStrings": { |
|||
"Default": "Data Source=mysql.development.cn;Database=CompanyNameProjectName;uid=root;pwd=mysql@;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" |
|||
}, |
|||
"Cache": { |
|||
"Redis": { |
|||
"ConnectionString": "redis.development.yhglobal.cn,password=OD5VbzIuAWsHOZV5ncYx9xaDsAMsKXn7", |
|||
"DatabaseId": 231 |
|||
} |
|||
}, |
|||
"AuthServer": { |
|||
"Authority": "https://localhost:44363", |
|||
"RequireHttpsMetadata": "false" |
|||
}, |
|||
"Jwt": { |
|||
"Audience": "http://localhost:5010", //客户端标识 |
|||
"SecurityKey": "dzehzRz9a8asdfasfdadfasdfasdfafsdadfasbasdf=", |
|||
"Issuer": "CompanyNameProjectName", //签发者 |
|||
"ExpirationTime": 2 //过期时间 hour |
|||
}, |
|||
"LogToElasticSearch": { |
|||
"Enabled": "true", |
|||
"ElasticSearch": { |
|||
"Url": "http://es.cn", |
|||
"IndexFormat": "CompanyNameProjectName.admin.api.dev-{0:yyyy.MM.dd}", |
|||
"UserName": "CompanyNameProjectName", |
|||
"Password": "TCYobkZxWu0ELYZY" |
|||
} |
|||
} |
|||
} |
|||
@ -1,61 +0,0 @@ |
|||
{ |
|||
"App": { |
|||
"SelfUrl": "https://localhost:44363", |
|||
"CorsOrigins": "https://*.CompanyNameProjectName.com,http://localhost:8083,http://localhost:8081,https://localhost:44307," |
|||
}, |
|||
"StringEncryption": { |
|||
"DefaultPassPhrase": "MY2bTgp2iaHUEp66" |
|||
}, |
|||
"Settings": { |
|||
"Abp.Mailing.Smtp.Host": "127.0.0.1", |
|||
"Abp.Mailing.Smtp.Port": "25", |
|||
"Abp.Mailing.Smtp.UserName": "", |
|||
"Abp.Mailing.Smtp.Password": "", |
|||
"Abp.Mailing.Smtp.Domain": "", |
|||
"Abp.Mailing.Smtp.EnableSsl": "false", |
|||
"Abp.Mailing.Smtp.UseDefaultCredentials": "true", |
|||
"Abp.Mailing.DefaultFromAddress": "noreply@abp.io", |
|||
"Abp.Mailing.DefaultFromDisplayName": "ABP application" |
|||
}, |
|||
"Serilog": { |
|||
"MinimumLevel": { |
|||
"Default": "Information", |
|||
"Override": { |
|||
"Microsoft": "Information", |
|||
"Microsoft.AspNetCore": "Information", |
|||
"System": "Warning", |
|||
"Microsoft.Hosting.Lifetime": "Information", |
|||
"Microsoft.AspNetCore.Routing": "Information", |
|||
"Microsoft.AspNetCore.Hosting.Diagnostics": "Error" |
|||
} |
|||
} |
|||
}, |
|||
"ConnectionStrings": { |
|||
"Default": "Data Source=mysql.development.cn;Database=CompanyNameProjectName;uid=root;pwd=mysql@;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" |
|||
}, |
|||
"Cache": { |
|||
"Redis": { |
|||
"ConnectionString": "redis.development.yhglobal.cn,password=OD5VbzIuAWsHOZV5ncYx9xaDsAMsKXn7", |
|||
"DatabaseId": 231 |
|||
} |
|||
}, |
|||
"AuthServer": { |
|||
"Authority": "https://localhost:44363", |
|||
"RequireHttpsMetadata": "false" |
|||
}, |
|||
"Jwt": { |
|||
"Audience": "http://localhost:5010", //客户端标识 |
|||
"SecurityKey": "dzehzRz9a8asdfasfdadfasdfasdfafsdadfasbasdf=", |
|||
"Issuer": "CompanyNameProjectName", //签发者 |
|||
"ExpirationTime": 2 //过期时间 hour |
|||
}, |
|||
"LogToElasticSearch": { |
|||
"Enabled": "true", |
|||
"ElasticSearch": { |
|||
"Url": "http://es.cn", |
|||
"IndexFormat": "CompanyNameProjectName.admin.api.dev-{0:yyyy.MM.dd}", |
|||
"UserName": "CompanyNameProjectName", |
|||
"Password": "TCYobkZxWu0ELYZY" |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
using System; |
|||
|
|||
namespace CompanyNameProjectName.Attributes |
|||
{ |
|||
public class DontWrapResultAttribute : Attribute |
|||
{ |
|||
public DontWrapResultAttribute() |
|||
{ |
|||
} |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,31 @@ |
|||
namespace CompanyNameProjectName.Attributes |
|||
{ |
|||
public class WrapResult<T> |
|||
{ |
|||
public bool Success { get; set; } |
|||
|
|||
public string Message { get; set; } |
|||
|
|||
public T Data { get; set; } |
|||
public WrapResult() |
|||
{ |
|||
Success = true; |
|||
Message = "Success"; |
|||
Data = default; |
|||
} |
|||
|
|||
public void SetSucess(T data, string message = "Success") |
|||
{ |
|||
Success = true; |
|||
Data = data; |
|||
} |
|||
|
|||
public void SetFail(string message = "Fail") |
|||
{ |
|||
Success = false; |
|||
Message = message; |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
|||
@ -1,5 +1,5 @@ |
|||
{ |
|||
"ConnectionStrings": { |
|||
"Default": "Data Source=localhost;Database=CompanyNameProjectName;uid=root;pwd=mypassword;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" |
|||
"Default": "Data Source=localhost;port=3307;Database=CompanyNameProjectName;uid=root;pwd=mypassword;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,30 @@ |
|||
#!/bin/sh |
|||
if [ -z "$husky_skip_init" ]; then |
|||
debug () { |
|||
[ "$HUSKY_DEBUG" = "1" ] && echo "husky (debug) - $1" |
|||
} |
|||
|
|||
readonly hook_name="$(basename "$0")" |
|||
debug "starting $hook_name..." |
|||
|
|||
if [ "$HUSKY" = "0" ]; then |
|||
debug "HUSKY env variable is set to 0, skipping hook" |
|||
exit 0 |
|||
fi |
|||
|
|||
if [ -f ~/.huskyrc ]; then |
|||
debug "sourcing ~/.huskyrc" |
|||
. ~/.huskyrc |
|||
fi |
|||
|
|||
export readonly husky_skip_init=1 |
|||
sh -e "$0" "$@" |
|||
exitCode="$?" |
|||
|
|||
if [ $exitCode != 0 ]; then |
|||
echo "husky - $hook_name hook exited with code $exitCode (error)" |
|||
exit $exitCode |
|||
fi |
|||
|
|||
exit 0 |
|||
fi |
|||
Loading…
Reference in new issue