1.一共有五類過濾器IAsyncAuthorizationFilter IAsyncResourceFilter IAsyncActonFilter IAsyncExceptionFilter IAsyncResultFilter 去掉Async就是同步的
2.注冊過濾器 全局注冊和Attribute注冊 用在特定的Action上
通過過濾器實現全局異常處理
1.建立自己的一個過濾器
public class CustomerExceptionFilter : Attribute, IExceptionFilter { private readonly ILogger logger = null; private readonly IHostingEnvironment environment = null; public CustomerExceptionFilter(ILogger<CustomerExceptionFilter> logger, IHostingEnvironment environment) { this.logger = logger; this.environment = environment; } public void OnException(ExceptionContext context) { Exception exception = context.Exception; string error = string.Empty; void ReadException(Exception ex) { error += string.Format("{0} | {1} | {2}", ex.Message, ex.StackTrace, ex.InnerException); if (ex.InnerException != null) { ReadException(ex.InnerException); } } ReadException(context.Exception); logger.LogError(error); ContentResult result = new ContentResult { StatusCode = 500, ContentType = "text/json;charset=utf-8;" }; if (environment.IsDevelopment()) { var json = new { message = exception.Message, detail = error }; result.Content = JsonConvert.SerializeObject(json); } else { result.Content = "抱歉,出錯了"; } context.Result = result; context.ExceptionHandled = true; } }
2.添加Nugut包 NLog.Extensions.Logging NLog.Web.AspNetCore ,並在 Startup.cs 文件的 Configure 方法中添加擴展
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory factory) { // 將 NLog factory.AddConsole(Configuration.GetSection("Logging")) .AddNLog() .AddDebug(); var nlogFile = System.IO.Path.Combine(env.ContentRootPath, "nlog.config"); env.ConfigureNLog(nlogFile); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); }
3.日志配置文件信息
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="info"> <!-- Load the ASP.NET Core plugin --> <extensions> <add assembly="NLog.Web.AspNetCore"/> </extensions> <!-- Layout: https://github.com/NLog/NLog/wiki/Layout%20Renderers --> <targets> <target xsi:type="File" name="errorfile" fileName="/data/logs/logfilter/error-${shortdate}.log" layout="${longdate}|${logger}|${uppercase:${level}}| ${message} ${exception}|${aspnet-Request-Url}" /> <target xsi:type="Null" name="blackhole" /> </targets> <rules> <logger name="Microsoft.*" minlevel="Error" writeTo="blackhole" final="true" /> <logger name="*" minlevel="Error" writeTo="errorfile" /> </rules> </nlog>
4.把這個過濾器注入到容器中
services.AddMvc( options => { options.Filters.Add(typeof(CustomerExceptionFilter)); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
只要請求進入到了MVC中間件中之后拋的異常 都會進到自定義的Filter中
************************
通過中間件實現全局異常處理
1.建立一個自定義的全局異常處理中間件
public class ExceptionMiddleware { private readonly RequestDelegate next; private readonly ILogger logger; private IHostingEnvironment environment; public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger, IHostingEnvironment environment) { this.next = next; this.logger = logger; this.environment = environment; } public async Task Invoke(HttpContext context) { try { await next.Invoke(context); var features = context.Features; } catch (Exception e) { await HandleException(context, e); } } private async Task HandleException(HttpContext context, Exception e) { context.Response.StatusCode = 500; context.Response.ContentType = "text/json;charset=utf-8;"; string error = ""; void ReadException(Exception ex) { error += string.Format("{0} | {1} | {2}", ex.Message, ex.StackTrace, ex.InnerException); if (ex.InnerException != null) { ReadException(ex.InnerException); } } ReadException(e); if (environment.IsDevelopment()) { var json = new { message = e.Message, detail = error }; error = JsonConvert.SerializeObject(json); } else error = "抱歉,出錯了"; await context.Response.WriteAsync(error); } }
2.在管道中加入自定義中間件
app.UseMiddleware<ExceptionMiddleware>();
2.在管道中通過try catch進行異常捕獲 這個中間件后面的所有代碼都在 try catch里面 只要出發了異常 就會給當前中間件捕獲
注意 在某個中間件中發生了異常 但是他拋出的時候 在當前中間件就處理掉了 沒有繼續往上拋出 這時候就捕獲不到
https://www.cnblogs.com/viter/p/10013195.html