using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using TEAMModelOS.SDK.Context.Exception;
using TEAMModelOS.SDK.Helper.Common.JsonHelper;
using static TEAMModelOS.SDK.Context.Filter.HttpGlobalExceptionInvoke;
namespace TEAMModelOS.SDK.Context.Filters
{
///
/// 全局异常处理
///
public class HttpGlobalExceptionFilter : IExceptionFilter
{
readonly ILoggerFactory _loggerFactory;
readonly IWebHostEnvironment _env;
public HttpGlobalExceptionFilter(ILoggerFactory loggerFactory, IWebHostEnvironment env)
{
_loggerFactory = loggerFactory;
_env = env;
}
///
/// 异常拦截
///
///
public async void OnException(ExceptionContext context)
{
int code = context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
if (context.Exception is BizException)
{
context.HttpContext.Response.StatusCode = 200;
}
var errorResponse = new ErrorResponse(1, context.Exception.Message);
// errorResponse.devMessage = context.Exception.StackTrace;
context.Result = new ApplicationErrorResult(errorResponse, code);
context.ExceptionHandled = true;
if (context.HttpContext.Response.StatusCode != 200)//未捕捉过并且状态码不为200
{
string msg = "";
switch (context.HttpContext.Response.StatusCode)
{
case 401:
msg = "Unauthorized";
break;
case 404:
msg = "Service Not Found";
break;
case 502:
msg = "Request Erro";
break;
case 500:
msg = context.Exception.Message;
break;
case 403:
msg = context.Exception.Message;
break;
default:
msg = "Unknown Error";
break;
}
await HandleExceptionAsync(context.HttpContext, context.HttpContext.Response.StatusCode, msg, context.Exception == null ? "" : context.Exception.StackTrace);
}
}
private static async Task HandleExceptionAsync(HttpContext context, int statusCode, string msg, string devmsg)
{
var data = new ErrorResponse(statusCode, msg, devmsg);
context.Response.ContentType = "application/json;charset=utf-8";
await context.Response.WriteAsync(JsonSerialization.ToJson(data));
}
}
public class ApplicationErrorResult : ObjectResult
{
public ApplicationErrorResult(object value, int code) : base(value)
{
StatusCode = code;
}
}
}