基本API上的通用异步尝试捕获-ASP网络核心
我已经在NetCore2.2项目的基础API上创建了一个通用的try/catch方法,我不确定这个通用方法的性能。这是一个好方法吗 这是基于基本api:基本API上的通用异步尝试捕获-ASP网络核心,api,asp.net-core,generics,Api,Asp.net Core,Generics,我已经在NetCore2.2项目的基础API上创建了一个通用的try/catch方法,我不确定这个通用方法的性能。这是一个好方法吗 这是基于基本api: protected async Task<IActionResult> TryReturnOk<TReturn>(Func<Task<TReturn>> function) { try { var re
protected async Task<IActionResult> TryReturnOk<TReturn>(Func<Task<TReturn>> function)
{
try
{
var result = await function();
return Ok(result);
}
catch (Exception ex)
{
_fileLogger.LogError(ex.Message);
_fileLogger.LogError(ex.StackTrace);
return BadRequest(ex);
}
}
受保护的异步任务TryReturnOk(Func函数)
{
尝试
{
var result=等待函数();
返回Ok(结果);
}
捕获(例外情况除外)
{
_fileLogger.LogError(例如消息);
_fileLogger.LogError(例如StackTrace);
返回请求(ex);
}
}
在api-s中的post方法中使用,如:
public async Task<IActionResult> Post([FromBody] LogViewModel log)
{
return await TryReturnOk(() => _writeLogService.WriteLog(log));
}
public异步任务发布([FromBody]LogViewModel日志)
{
返回wait wait TryReturnOk(()=>_writeLogService.WriteLog(log));
}
我不会把所有的控制器弄得乱七八糟,而是像下面这样集中地登录到中间件
400错误请求
应在请求模型无效等情况下使用。当抛出异常时,500更合适
public class LoggerMiddleware
{
private readonly ILogger _fileLogger;
private readonly RequestDelegate _next;
public LoggerMiddleware(RequestDelegate next, ILogger fileLogger)
{
_next = next;
_fileLogger = fileLogger;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception ex)
{
_fileLogger.LogError(ex.Message);
_fileLogger.LogError(ex.StackTrace);
context.Response.Clear();
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
}
}
}
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseLoggerMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<LoggerMiddleware>();
}
}
我不会把所有的控制器弄得乱七八糟,而是像下面这样集中地记录到中间件上
400错误请求
应在请求模型无效等情况下使用。当抛出异常时,500更合适
public class LoggerMiddleware
{
private readonly ILogger _fileLogger;
private readonly RequestDelegate _next;
public LoggerMiddleware(RequestDelegate next, ILogger fileLogger)
{
_next = next;
_fileLogger = fileLogger;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next.Invoke(context);
}
catch (Exception ex)
{
_fileLogger.LogError(ex.Message);
_fileLogger.LogError(ex.StackTrace);
context.Response.Clear();
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
}
}
}
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseLoggerMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<LoggerMiddleware>();
}
}
如果不为空,您可能还需要记录
InnerException
。这应该在循环中完成。如果不为空,您可能还需要记录InnerException
。这应该在循环中完成。