net6 项目搭建及引用框架记录(log4net,autofac,exception,api result,jwt,efcore)四、全局异常处理

首先创建一个返回值模型类,在IRepository项目里创建接口,在Repository项目里创建实体类,这样做是为了能够直接实现依赖注入

 

namespace NET6Demo.IRepository //注意这里的命名空间,并没有Utilities
{
    public interface IResultModel
    {
        int StatusCode { get; set; }

        string? Message { get; set; }

        object? Result { get; set; }
    }
}

 

using NET6Demo.Interface.Dependency;
using NET6Demo.IRepository;


namespace NET6Demo.Repository //注意这里的命名空间,并没有Utilities
{
    public class ResultModel : IResultModel, IDependency
    {
        public int StatusCode { get; set; }

        public string? Message { get; set; } = String.Empty;

        public object? Result { get; set; } = null;
    }
}

在Utility项目中建立异常处理中间件

 

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using NET6Demo.IRepository;
using System.Text.Json;

namespace NET6Demo.Utility.ErrorHandler
{
    public class ExceptionHandlingMiddleware
    {
        private readonly RequestDelegate _next;  // 用来处理上下文请求  
        private readonly ILogger<ExceptionHandlingMiddleware> _logger;
        private IResultModel errorResponse;
        public ExceptionHandlingMiddleware(
            RequestDelegate next,
            ILogger<ExceptionHandlingMiddleware> logger,
            IResultModel result
           )
        {
            _next = next;
            _logger = logger;
            errorResponse = result;
        }
        public async Task InvokeAsync(HttpContext httpContext)
        {
            try
            {
                await _next(httpContext); //要么在中间件中处理,要么被传递到下一个中间件中去
            }
            catch (Exception ex)
            {
                await HandleExceptionAsync(httpContext, ex); // 捕获异常了 在HandleExceptionAsync中处理
            }
        }

        private async Task HandleExceptionAsync(HttpContext context, Exception exception)
        {
            //errorResponse = new ResultModel();

            _logger.LogError(exception.Message);
            context.Response.ContentType = "application/json";  // 返回json 类型

            var response = context.Response;

            switch (exception)
            {
                case ApplicationException ex:
                    if (ex.Message.Contains("Invalid token"))
                    {
                        response.StatusCode = errorResponse.StatusCode = StatusCodes.Status403Forbidden;
                        errorResponse.Message = "Invalid token";
                        break;
                    }

                    response.StatusCode = errorResponse.StatusCode = StatusCodes.Status400BadRequest;
                    errorResponse.Message = ex.Message;
                    break;

                case KeyNotFoundException ex:

                    response.StatusCode = errorResponse.StatusCode = StatusCodes.Status404NotFound;
                    errorResponse.Message = ex.Message;
                    break;
                default:
                    response.StatusCode = errorResponse.StatusCode = StatusCodes.Status500InternalServerError;
                    errorResponse.Message = "Internal Server errors. Check Logs!";
                    break;
            }
            _logger.LogError(exception.Message);
            var result = JsonSerializer.Serialize(errorResponse);
            await context.Response.WriteAsync(result);
        }
    }
}

在program.cs中添加中间件引用

#region 统一异常处理
app.UseMiddleware<ExceptionHandlingMiddleware>();
#endregion

修改TestController中的代码,来测试一下

[HttpGet("GetTest")]
        public async Task<IActionResult> GetTestResult(string userId)
        {
            Console.WriteLine("测试一下输出日志");
            _logger.LogInformation("日志输出了");
            _user = _provider.GetService<IUsers>().GetUser(userId);
            throw new Exception("Test exception");
            //return Ok(_user);
        }

运行起来,在swagger中测试GetTest。

 

 可以看到API返回了我们自定义的结果。同时项目的bin文件夹中,也产生的相应的错误日志

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 WPF 中使用 log4net 实现依赖注入可以按照以下步骤进行: 1. 首先,确保你已经引入 log4net 库,并在你的项目中配置好 log4net。 2. 在你的应用程序的入口点(通常是 App.xaml.cs 文件中的 Application_Startup 方法),初始化 log4net。可以使用 `XmlConfigurator.Configure()` 方法来加载 log4net 的配置文件,或者使用 `BasicConfigurator.Configure()` 方法来使用默认的配置。例如: ```csharp using log4net; using log4net.Config; // ... public partial class App : Application { private static readonly ILog log = LogManager.GetLogger(typeof(App)); protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); XmlConfigurator.Configure(); // 或者 BasicConfigurator.Configure(); // ... 其他初始化代码 log.Info("Application started"); } } ``` 3. 创建一个接口来定义 log4net 的日志功能,例如 `ILogger` 接口: ```csharp public interface ILogger { void Debug(object message); void Info(object message); void Warn(object message); void Error(object message); void Fatal(object message); } ``` 4. 创建一个实现 `ILogger` 接口的 log4net 日志封装类: ```csharp using log4net; public class Log4NetLogger : ILogger { private readonly ILog log; public Log4NetLogger(Type type) { log = LogManager.GetLogger(type); } public void Debug(object message) { log.Debug(message); } public void Info(object message) { log.Info(message); } public void Warn(object message) { log.Warn(message); } public void Error(object message) { log.Error(message); } public void Fatal(object message) { log.Fatal(message); } } ``` 5. 在需要使用日志的类中,通过构造函数注入 `ILogger` 接口的实例。例如: ```csharp public class MyClass { private readonly ILogger logger; public MyClass(ILogger logger) { this.logger = logger; } public void DoSomething() { logger.Info("Doing something..."); // 其他逻辑 } } ``` 这样,在创建 `MyClass` 的实例时,可以通过依赖注入容器(如 Unity、Autofac 等)来自动解析并注入 `ILogger` 的实例,从而实现对 log4net 的依赖注入。 请注意,这里使用了简单的示例来说明 log4net 的依赖注入,实际应用中可能需要更复杂的配置和集成。具体的实现方式可能会根据你使用的依赖注入容器和项目结构而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值