using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;
using TEAMModelOS.SDK.Context.Constant.Common;
using TEAMModelOS.SDK.Context.Exception;
using TEAMModelOS.SDK.Helper.Common.JsonHelper;
namespace TEAMModelOS.SDK.Context.Filter
{
public class HttpGlobalExceptionInvoke
{
private readonly RequestDelegate _next;
///
///
///
///
public HttpGlobalExceptionInvoke(RequestDelegate next)
{
_next = next;
}
///
///
///
///
///
public async Task Invoke(HttpContext context)
{
int bizCode = 0;
System.Exception exs = null;
bool isCatched = false;
try
{
await _next(context);
}
catch (System.Exception ex) //发生异常
{
exs = ex;
//自定义业务异常
if (ex is BizException)
{
bizCode = ((BizException)ex).code;
if (bizCode == 401 || bizCode == 404 || bizCode == 502 || bizCode == 403)
{
context.Response.StatusCode = bizCode;
}
else {
context.Response.StatusCode = 200;
}
// context.Response.StatusCode = ((BizException)ex).code;
}
//未知异常
else
{
context.Response.StatusCode = 500;
//LogHelper.SetLog(LogLevel.Error, ex);
}
await HandleExceptionAsync(context, bizCode, ex.Message, ex.StackTrace);
isCatched = true;
}
finally
{
if (!isCatched && context.Response.StatusCode != 200)//未捕捉过并且状态码不为200
{
string msg = "";
switch (context.Response.StatusCode)
{
case 401:
msg = "Unauthorized";
break;
case 404:
msg = "Service Not Found";
break;
case 502:
msg = "Request Erro";
break;
case 500:
msg = exs.Message;
break;
case 403:
msg = exs.Message;
break;
default:
msg = "Unknown Error";
break;
}
await HandleExceptionAsync(context, bizCode, msg, exs == null ? "" : exs.StackTrace);
}
}
}
///
///
///
///
///
///
///
///
///
private static async Task HandleExceptionAsync(HttpContext context, int bizCode, string msg, string devmsg)
{
var data = new ErrorResponse(bizCode, msg, devmsg);
context.Response.ContentType = Constants.CONTENT_TYPE_JSON;
await context.Response.WriteAsync(JsonNetHelper.ToJson(data));
}
///
/// 异常信息封装
///
///
public class ErrorResponse
{
public ErrorResponse()
{
error = new ErrorModel();
}
public ErrorResponse(string message)
{
error = new ErrorModel
{
message = message,
devmsg = message
};
}
public ErrorResponse(int code, string message)
{
error = new ErrorModel
{
message = message,
devmsg = message,
code = code
};
}
public ErrorResponse(int code, string message, string devMessage)
{
error = new ErrorModel
{
message = message,
devmsg = message,
code = code
};
error.devmsg = devMessage;
}
public string jsonrpc { get; set; } = "2.0";
public double id { get; set; } = 1;
private object result { get; set; } = null;
public ErrorModel error { get; set; } = null;
}
}
public class ErrorModel
{
public long responseTime = DateTime.Now.Ticks;
public float code { get; set; } = 1;
public string message { get; set; }
public string devmsg { get; set; }
public E data { get; set; }
}
}