什么是Filter
面向切面编程,在ASP.NET Core特定的位置执行我们自定义的代码。
ASP.NET Core 中的Filter的五种类型:Authorization filter、
Resource filter、Action filter、Exception filter、Result filter。
创建一个Controller
[Route("api/[controller]")]
[ApiController]
public class CustomController : ControllerBase
{
// GET: api/<CustomController>
[HttpGet]
public IEnumerable<string> Get()
{
throw new Exception("出错了");
return new string[] { "value1", "value2" };
}
// GET api/<CustomController>/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/<CustomController>
[HttpPost]
public void Post([FromBody] string value)
{
}
// PUT api/<CustomController>/5
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value)
{
}
// DELETE api/<CustomController>/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
创建一个Exception filter
public class CustomExceptionFilter : IAsyncExceptionFilter
{
private readonly IWebHostEnvironment hostEnvironment;
private readonly ILogger<CustomExceptionFilter> _logger;
public CustomExceptionFilter(ILogger<CustomExceptionFilter> logger,IWebHostEnvironment hostEnvironment)
{
this.hostEnvironment = hostEnvironment;
this._logger= logger;
}
public Task OnExceptionAsync(ExceptionContext context)
{
//context.Exception代表异常信息对象
//context.ExceptionHandled = true;其他exceptionFilter不会再执行
//context.Result的值会被输出给客户端
Exception exception = context.Exception;
_logger.LogError(exception, "UnhandledException occured");
string message;
if (hostEnvironment.IsDevelopment())
{
message = exception.ToString();
}
else
{
message = "程序中出现未处理异常";
ObjectResult result = new ObjectResult(new { code = 500, message = message });
result.StatusCode = 500;
context.Result = result;
context.ExceptionHandled = true;
}
return Task.CompletedTask;
}
}
在程序入口Program.cs中注册CustomExceptionFilter
builder.Services.Configure<MvcOptions>(opt => {
opt.Filters.Add<CustomExceptionFilter>();
});
参考书籍 杨中科《ASP.NET Core技术内幕与项目实战》