9 changed files with 16 additions and 296 deletions
-
2src/Shentun.Peis.Application.Contracts/CustomerOrgs/UpdateCustomerOrgDto.cs
-
102src/Shentun.Peis.HttpApi.Host/ErrorHandlerMiddleWare.cs
-
3src/Shentun.Peis.HttpApi.Host/Filter/ApplicationDescription.cs
-
0src/Shentun.Peis.HttpApi.Host/Filter/AuthorizationMiddlewareResultHandler.cs
-
5src/Shentun.Peis.HttpApi.Host/Filter/CustomerActionFilterAttribute.cs
-
9src/Shentun.Peis.HttpApi.Host/Filter/CustomerExceptionFilterAttribute.cs
-
4src/Shentun.Peis.HttpApi.Host/PeisHttpApiHostModule.cs
-
111src/Shentun.Peis.HttpApi.Host/PlanExceptionAttribute.cs
-
76src/Shentun.Peis.HttpApi.Host/WebApiExceptionFilterAttribute.cs
@ -1,102 +0,0 @@ |
|||
using Microsoft.AspNetCore.Http.Features; |
|||
using Microsoft.AspNetCore.Http; |
|||
using Microsoft.Net.Http.Headers; |
|||
using System.Net; |
|||
using System.Text.Encodings.Web; |
|||
using System.Text.Json; |
|||
using System.Text.Unicode; |
|||
using System; |
|||
using System.Threading.Tasks; |
|||
using Microsoft.IdentityModel.Logging; |
|||
|
|||
namespace Shentun.Peis |
|||
{ |
|||
public class ErrorHandlerMiddleWare |
|||
{ |
|||
//请求委托
|
|||
private readonly RequestDelegate _next; |
|||
|
|||
// private readonly LogHelper _nlogger;
|
|||
|
|||
public ErrorHandlerMiddleWare(RequestDelegate next |
|||
//, LogHelper nlogger
|
|||
) |
|||
{ |
|||
this._next = next; |
|||
// this._nlogger = nlogger;
|
|||
} |
|||
|
|||
public async Task Invoke(HttpContext context) |
|||
{ |
|||
try |
|||
{ |
|||
await this._next.Invoke(context); |
|||
} |
|||
catch (Exception ex) |
|||
{ |
|||
await HandleExceptionAsync(context, ex); |
|||
} |
|||
} |
|||
|
|||
private async Task HandleExceptionAsync(HttpContext context, Exception exception) |
|||
{ |
|||
if (exception == null) return; |
|||
await HandleErrorResultAsync(context, exception).ConfigureAwait(false); |
|||
} |
|||
|
|||
private async Task HandleErrorResultAsync(HttpContext context, Exception exception) |
|||
{ |
|||
//记录日志
|
|||
// _nlogger.LogError(exception);
|
|||
//返回友好的提示
|
|||
var response = context.Response; |
|||
//清除原有HTTP上下文信息,为了明确指定程序出现异常,防止异常未被处理而后续当做正常操作执行
|
|||
ClearHttpContext(context); |
|||
//状态码
|
|||
if (exception is UnauthorizedAccessException) |
|||
response.StatusCode = (int)HttpStatusCode.Unauthorized; |
|||
else if (exception is BadHttpRequestException) |
|||
response.StatusCode = (int)HttpStatusCode.BadRequest; |
|||
else if (response.StatusCode == 403 || response.StatusCode == 404) { } |
|||
else response.StatusCode = (int)HttpStatusCode.InternalServerError; |
|||
|
|||
response.ContentType = context.Request.Headers["Accept"]; |
|||
var result = new ApiResult |
|||
{ |
|||
Code = 500, |
|||
Message = exception.GetBaseException().Message |
|||
}; |
|||
if (response.ContentType.ToLower() != "application/x-www-form-urlencoded") |
|||
{ |
|||
response.ContentType = "application/json"; |
|||
} |
|||
await response.WriteAsync(JsonSerializer.Serialize(result |
|||
, new JsonSerializerOptions() |
|||
{ |
|||
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All), |
|||
PropertyNameCaseInsensitive = true, |
|||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase |
|||
})).ConfigureAwait(false); |
|||
} |
|||
|
|||
private static void ClearHttpContext(HttpContext context) |
|||
{ |
|||
context.Response.Clear(); |
|||
//因为可能创建了新的终结点,所以执行管道会有所调整,所以需要重新计算
|
|||
context.SetEndpoint(endpoint: null); |
|||
var routeValuesFeature = context.Features.Get<IRouteValuesFeature>(); |
|||
routeValuesFeature?.RouteValues?.Clear(); |
|||
} |
|||
|
|||
private static Task ClearCacheHeaders(object state) |
|||
{ |
|||
//清除输出缓存相关
|
|||
var headers = ((HttpResponse)state).Headers; |
|||
headers[HeaderNames.CacheControl] = "no-cache"; |
|||
headers[HeaderNames.Pragma] = "no-cache"; |
|||
headers[HeaderNames.Expires] = "-1"; |
|||
headers.Remove(HeaderNames.ETag); |
|||
return Task.CompletedTask; |
|||
} |
|||
} |
|||
} |
|||
@ -1,111 +0,0 @@ |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Microsoft.AspNetCore.Mvc.Filters; |
|||
using Microsoft.Extensions.Logging; |
|||
|
|||
namespace Shentun.Peis |
|||
{ |
|||
public class PlanExceptionAttribute |
|||
{ |
|||
//private readonly ILogger<PlanExceptionAttribute> _logger;
|
|||
|
|||
|
|||
///// <summary>
|
|||
/////
|
|||
///// </summary>
|
|||
///// <param name="context"></param>
|
|||
//public override void OnException(ExceptionContext context)
|
|||
//{
|
|||
|
|||
// // 如果异常没有被处理则进行处理
|
|||
// if (context.ExceptionHandled == false)
|
|||
// {
|
|||
// var userExpect = context.Exception as OnlineContractException;
|
|||
// var info = new ExceptionModel();
|
|||
// info.code = "500";
|
|||
// info.success = false;
|
|||
// info.message = "服务器遇到一个错误,无法继续为您服务!";
|
|||
|
|||
// if (userExpect != null)
|
|||
// {
|
|||
// info.code = $"{userExpect.Code}";
|
|||
// info.message = context.Exception.Message;
|
|||
// }
|
|||
// else
|
|||
// {
|
|||
// var volexception = context.Exception as OnlineContractException;
|
|||
// if (volexception != null)
|
|||
// {
|
|||
// info.code = $"{volexception.Code}";
|
|||
// info.message = volexception.Message;
|
|||
// }
|
|||
// }
|
|||
// if (context.ModelState != null)
|
|||
// {
|
|||
// if (context.ModelState.Count > 0)
|
|||
// {
|
|||
// foreach (var key in context.ModelState.Keys)
|
|||
// {
|
|||
// context.ModelState.TryGetValue(key, out var val);
|
|||
// if (val.Errors.Count > 0)
|
|||
// {
|
|||
// info.message = key + "::" + val.Errors[0].ErrorMessage;
|
|||
// break;
|
|||
// }
|
|||
// }
|
|||
// }
|
|||
// }
|
|||
|
|||
// if (info.code == "500")
|
|||
// {
|
|||
// //写入日志
|
|||
// _logger.LogError(context.Exception, context.HttpContext.Request.Path, null);
|
|||
|
|||
// }
|
|||
|
|||
|
|||
// context.Result = new ContentResult
|
|||
// {
|
|||
// // 返回状态码设置为200,表示成功
|
|||
// StatusCode = int.Parse(info.code),
|
|||
// // 设置返回格式
|
|||
// ContentType = "application/json;charset=utf-8",
|
|||
// Content = Newtonsoft.Json.JsonConvert.SerializeObject(info)
|
|||
// };
|
|||
// }
|
|||
// // 设置为true,表示异常已经被处理了
|
|||
// context.ExceptionHandled = true;
|
|||
|
|||
//}
|
|||
|
|||
|
|||
///// <summary>
|
|||
/////
|
|||
///// </summary>
|
|||
///// <param name="context"></param>
|
|||
///// <returns></returns>
|
|||
//public override System.Threading.Tasks.Task OnExceptionAsync(ExceptionContext context)
|
|||
//{
|
|||
// return base.OnExceptionAsync(context);
|
|||
//}
|
|||
|
|||
} |
|||
|
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
public class ExceptionModel |
|||
{ |
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
public string code { get; set; } |
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
public bool success { get; set; } |
|||
/// <summary>
|
|||
///
|
|||
/// </summary>
|
|||
public string message { get; set; } |
|||
} |
|||
} |
|||
@ -1,76 +0,0 @@ |
|||
using Microsoft.AspNetCore.Mvc; |
|||
using Microsoft.AspNetCore.Mvc.Filters; |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Microsoft.Extensions.Logging; |
|||
using Shentun.Utilities; |
|||
using Shentun.WebApi.Service; |
|||
using System; |
|||
using System.Data.SqlClient; |
|||
using System.Net; |
|||
using System.Net.Http; |
|||
using Volo.Abp; |
|||
using Volo.Abp.AspNetCore.ExceptionHandling; |
|||
|
|||
namespace Shentun.Peis |
|||
{ |
|||
public class WebApiExceptionFilterAttribute : Microsoft.AspNetCore.Mvc.Filters.ExceptionFilterAttribute |
|||
{ |
|||
private readonly ILogger<WebApiExceptionFilterAttribute> _logger; |
|||
public WebApiExceptionFilterAttribute(ILogger<WebApiExceptionFilterAttribute> logger) |
|||
{ |
|||
_logger = logger; |
|||
} |
|||
//重写基类的异常处理方法
|
|||
public override void OnException(ExceptionContext exceptionContext) |
|||
{ |
|||
Console.WriteLine("WebApiExceptionFilter.OnException"); |
|||
var objectResult = exceptionContext.Result as ObjectResult; |
|||
//异常日志记录
|
|||
string error = string.Empty; |
|||
ReadException(exceptionContext.Exception, ref error); |
|||
//LogHelper.Logger.LogError(error);
|
|||
_logger.LogError("异常:" + error+ Environment.NewLine + "异常堆栈:" +exceptionContext.Exception.StackTrace |
|||
); |
|||
//处理异常信息
|
|||
|
|||
string errorMessage; |
|||
|
|||
if (exceptionContext.Exception is DbUpdateException) |
|||
{ |
|||
errorMessage = "数据库更新错误:" + exceptionContext.Exception.Message; |
|||
} |
|||
else if (exceptionContext.Exception is BusinessException) |
|||
{ |
|||
|
|||
errorMessage = "业务错误:" + exceptionContext.Exception.Message; |
|||
} |
|||
else if (exceptionContext.Exception is ArgumentNullException) |
|||
{ |
|||
|
|||
errorMessage = exceptionContext.Exception.Message; |
|||
} |
|||
else if(exceptionContext.Exception is ArgumentException) |
|||
{ |
|||
|
|||
errorMessage = exceptionContext.Exception.Message; |
|||
} |
|||
else |
|||
{ |
|||
errorMessage = exceptionContext.Exception.Message; |
|||
} |
|||
|
|||
exceptionContext.Result = new JsonResult(ReturnValue.CreateErrorInstance(errorMessage)); |
|||
exceptionContext.Exception = null; |
|||
//base.OnException(exceptionContext);
|
|||
} |
|||
|
|||
private void ReadException(Exception ex,ref string error) |
|||
{ |
|||
error += string.Format("{0} | {1} | {2}", ex.Message, ex.StackTrace, ex.InnerException); |
|||
if (ex.InnerException != null) |
|||
{ |
|||
ReadException(ex.InnerException,ref error); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue