Exception Filter
手动创建异常
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace Filter.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class FilterController : ControllerBase
{
[HttpGet]
public string t1()
{
string res = System.IO.File.ReadAllText("d:/1.tet");
return res;
}
}
}
创建拦截器
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace Filter
{
public class MyExceptionFilter : IAsyncExceptionFilter
{
private readonly IWebHostEnvironment webHost;
public MyExceptionFilter(IWebHostEnvironment webHost)
{
this.webHost = webHost;
}
public Task OnExceptionAsync(ExceptionContext context)
{
// context.Exception 代表异常信息对象
// context.ExceptionHandled true:其他ExceptionFilter不会执行
string msg;
if (webHost.IsDevelopment())
{
msg = context.Exception.ToString();
}
else
{
msg = "服务器发生未处理异常";
}
ObjectResult result = new ObjectResult(new
{
code = 500,
message = msg
});
context.Result = result;
context.ExceptionHandled = true;
return Task.CompletedTask;
}
}
}
注册服务
builder.Services.Configure<MvcOptions>(opt =>
{
opt.Filters.Add<MyExceptionFilter>();
});
测试
Action Filter
其他配置同理
创建拦截器
using Microsoft.AspNetCore.Mvc.Filters;
namespace Filter2
{
public class Filter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
Console.WriteLine("前代码");
ActionExecutedContext actionExecutedContext = await next();
Console.WriteLine("后代码");
}
}
}