MVC与WebApi中的异常统一处理 存入数据库 ILogger接口实现
时间: 2024-04-29 20:22:19 浏览: 9
在 MVC 和 WebApi 中,我们可以通过实现统一异常处理来捕获应用程序中的异常并记录到数据库中。这里介绍一种方法,使用 ILogger 接口实现日志记录。
1. 创建一个自定义异常处理器(CustomExceptionHandler),继承于 ExceptionHandler。
```csharp
public class CustomExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
//将异常记录到数据库
var logger = context.RequestContext.Configuration.DependencyResolver.GetService(typeof(ILogger)) as ILogger;
logger.LogException(context.Exception);
//返回错误信息
context.Result = new ResponseMessageResult(context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "An error occurred, please try again later."));
}
}
```
2. 在 WebApiConfig.cs 文件中注册异常处理器。
```csharp
public static void Register(HttpConfiguration config)
{
//注册异常处理器
config.Services.Replace(typeof(IExceptionHandler), new CustomExceptionHandler());
//其他配置...
}
```
3. 创建一个 ILogger 接口的实现类,用于将异常信息记录到数据库中。
```csharp
public class DatabaseLogger : ILogger
{
private readonly IDbContext _dbContext;
public DatabaseLogger(IDbContext dbContext)
{
_dbContext = dbContext;
}
public void LogException(Exception ex)
{
var log = new ExceptionLog()
{
Message = ex.Message,
StackTrace = ex.StackTrace,
InnerExceptionMessage = ex.InnerException?.Message,
InnerExceptionStackTrace = ex.InnerException?.StackTrace,
LogTime = DateTime.Now
};
_dbContext.ExceptionLogs.Add(log);
_dbContext.SaveChanges();
}
}
```
4. 在全局配置文件中注册 ILogger 接口的实现类。
```csharp
public class Global : HttpApplication
{
protected void Application_Start()
{
//注册 ILogger 接口的实现类
var container = new UnityContainer();
container.RegisterType<IDbContext, MyDbContext>();
container.RegisterType<ILogger, DatabaseLogger>();
GlobalConfiguration.Configuration.DependencyResolver = new UnityResolver(container);
//其他配置...
}
}
```
通过以上步骤,我们就可以将应用程序中的异常统一记录到数据库中了。需要注意的是,这里使用了 Unity 依赖注入框架,需要安装 Unity 包。另外,需要根据自己的数据库上下文(DbContext)和异常记录实体(ExceptionLog)进行修改。