如何在 C# ASP.NET WebAPI 中创建异常过滤器来处理未处理的异常?
当控制器方法抛出任何未处理的异常(不是 HttpResponseException 异常)时,将执行异常过滤器。HttpResponseException 类型是一个特例,因为它专门用于返回 HTTP 响应。
异常过滤器实现 System.Web.Http.Filters.IExceptionFilter 接口。编写异常过滤器的最简单方法是派生自 System.Web.Http.Filters.ExceptionFilterAttribute 类并覆盖 OnException 方法。
下面是一个将 NotFiniteNumberException 异常转换为 HTTP 状态代码 **416,请求的范围无法满足** 的过滤器。
**ExceptionFilterAttribute** −
示例
using System; using System.Net; using System.Net.Http; using System.Web.Http.Filters; namespace DemoWebApplication.Controllers{ public class ExceptionAttribute : ExceptionFilterAttribute{ public override void OnException(HttpActionExecutedContext context){ if (context.Exception is NotFiniteNumberException){ context.Response = new HttpResponseMessage(HttpStatusCode.RequestedRangeNotSatisfiable); } } } }
**控制器 ActionMethod** −
示例
using DemoWebApplication.Models; using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; namespace DemoWebApplication.Controllers{ [Exception] public class StudentController : ApiController{ List<Student> students = new List<Student>{ new Student{ Id = 1, Name = "Mark" }, new Student{ Id = 2, Name = "John" } }; public Student Get(int id){ if(id <= 0){ throw new NotFiniteNumberException("The Id is not valid"); } var studentForId = students.FirstOrDefault(x => x.Id == id); return studentForId; } } }
因此,让我们通过为控制器操作方法传递 id = 0 来测试上述 ExceptionAttribute。
ExceptionAttribute 可以通过以下任何一种方法注册。
用异常过滤器装饰 Action。
[Exception] public IHttpActionResult Get(int id){ Return Ok(); }
用异常过滤器装饰 Controller。
[Exception] public class StudentController : ApiController{ public IHttpActionResult Get(int id){ Return Ok(); } }
在 WebApiConfig.cs 中全局注册异常。
public static class WebApiConfig{ public static void Register(HttpConfiguration config){ config.Filters.Add(new ExceptionAttribute()); } }
广告