异常信息配置文件已被另一个程序更改_NET MVC全局异常处理(一)

.NET MVC全局异常处理

一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就可以,结果实际使用的时候还是遇到不少问题,所以要记录一下。

IIS配置

刚开始不想改程序代码,所以直接就想到了IIS里面的错误页配置配置,一开始反复测试,设置改了很多,但是没有效果,后来发现是静态页的配置,还没有进入MVC的程序部分,所以对于.NET MVC这种动态页是不生效的,应该使用.NET错误页选项

静态错误页配置

静态页配置流程如下:

18fcfbb5bc3a2f8cc2925dfb79ffce92.png

a4e0f768ce054b4296916ca6cee55447.png

f43db3ea84af758ccd5f3fb61bbeb755.png

如上图所示,IIS中配置对错误的响应有三种方式,默认情况是第三个,本地访问显示详细错误信息,外部地址访问显示自定义页面,这样方便开发者调试,如果没有设置专门的错误页会使用IIS自带的样式,也就是第二张图中的配置,根据路径我们可以找到这样一个文件夹,里面都是错误提示的静态页,对应不同的状态代码

a1e523f109eaa97cf56cefac1a169602.png

我们可以把IIS设置为均使用自定义错误页看下效果,或者直接通过文件访问

78dcb3add01321f35d6976681bf5312f.png

6688948fd180e4f0dc339e1fd6b1206e.png

上面那张是详细的静态404错误,可以看到会暴露我们系统路径,下面则是默认的自定义错误页

静态错误的默认页有相应的设置,看似可以修改,有“文件”、“执行URL”、“重定向”三种,但是实际设置一下就会发现报错:锁定错误

0f4b9cc62557f64186eb0db9a01facbf.png

通过这个错误我们去搜索解决方法可以看到一些人说将web.config中的httperror节下的defaultPath解锁即可,但似乎这是IIS7以前的设置,在IIS10中并没有相应的选项,看到一些说明提到可能是官方使用了更加安全的管理机制,因为发现这边的配置是静态页相关,不符合我的需要,没有深入研究,如果一定要使用这种可以看看这篇博客,试试能否通过系统命令解决锁定的问题

win7 IIS Web.config节点锁定问题

.NET错误页配置

.NET错误页的设置与静态页差不多,除了入口不一样,配置的选项也不太相同,但是整体意思一样

13d6d2d846c9bd231b51452ef4322893.png

326dcbc81ef386ed19e1857610f482c6.png

可以看到这里要求是绝对URL,所以实际使用起来应该是不太方便,所以没有找到太多相关资料。另外,需要web.conig中的customError设为On,部分异常如500会自动跳转到MVC的默认错误页Home/Error

b85fd006b31eed1ba806f2f1acf49c09.png

使用IIS的错误页处理虽然不用改代码,但是维护起来局限性很多,最终还是应该通过程序进行全局异常捕获

程序设置

通过程序控制的方法我想到两种,一个是使用全局配置文件Global.asax中的Application_Error方法,另一个是使用MVC的过滤器,默认的四种过滤器中就包含异常过滤

全局异常配置

这种方法对于WebForm和MVC都是通用的,在http://ASP.NET中,只要网站程序抛出未捕获的异常都会触发Application_Error事件。

使用此方法一定要把GlobalFilter全局过滤器中的HandleErrorAttribute注册取消掉,也可以将配置文件中的customErrors节点关闭,否则HTTP 500的错误将不会被Application_Error事件捕获。

dd1eee4160eef25384de73baf6724030.png

431b7bc3918137476fb2fd82ccdc50d4.png

捕获到异常之后我们可以很容易地跳转到静态页面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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)进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值