Przeglądaj źródła

异常处理优化

懒得勤快 5 lat temu
rodzic
commit
eda0d21c83

+ 32 - 0
src/Masuit.MyBlogs.Core/Controllers/ErrorController.cs

@@ -5,11 +5,15 @@ using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Infrastructure.Services;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.Tools;
+using Masuit.Tools.Logging;
 using Masuit.Tools.Security;
 using Masuit.Tools.Systems;
+using Microsoft.AspNetCore.Diagnostics;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
 using System;
+using System.Web;
 
 namespace Masuit.MyBlogs.Core.Controllers
 {
@@ -48,6 +52,34 @@ namespace Masuit.MyBlogs.Core.Controllers
         [Route("ServiceUnavailable"), ResponseCache(Duration = 36000)]
         public ActionResult ServiceUnavailable()
         {
+            var feature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
+            string err;
+            var req = HttpContext.Request;
+            var ip = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
+            switch (feature.Error)
+            {
+                case DbUpdateConcurrencyException ex:
+                    err = $"异常源:{ex.Source},异常类型:{ex.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(req.Path)},客户端用户代理:{req.Headers["User-Agent"]},客户端IP:{ip}\t{ex.InnerException?.Message}\t";
+                    LogManager.Error(err, ex);
+                    break;
+                case DbUpdateException ex:
+                    err = $"异常源:{ex.Source},异常类型:{ex.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(req.Path)},客户端用户代理:{req.Headers["User-Agent"]},客户端IP:{ip}\t{ex?.InnerException?.Message}\t";
+                    LogManager.Error(err, ex);
+                    break;
+                case AggregateException ex:
+                    LogManager.Debug("↓↓↓" + ex.Message + "↓↓↓");
+                    ex.Handle(e =>
+                    {
+                        LogManager.Error($"异常源:{e.Source},异常类型:{e.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(req.Path)},客户端用户代理:{req.Headers["User-Agent"]},客户端IP:{ip}\t", e);
+                        return true;
+                    });
+                    break;
+                case NotFoundException _:
+                    return View("Index");
+                default:
+                    LogManager.Error($"异常源:{feature.Error.Source},异常类型:{feature.Error.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(req.Path)},客户端用户代理:{req.Headers["User-Agent"]},客户端IP:{ip}\t", feature.Error);
+                    break;
+            }
             if (Request.Method.ToLower().Equals("get"))
             {
                 Response.StatusCode = 503;

+ 1 - 4
src/Masuit.MyBlogs.Core/Extensions/MiddlewareExtension.cs

@@ -55,10 +55,7 @@ namespace Masuit.MyBlogs.Core.Extensions
         /// <returns></returns>
         public static IServiceCollection AddMyMvc(this IServiceCollection services)
         {
-            services.AddMvc(options =>
-            {
-                options.Filters.Add<MyExceptionFilter>();
-            }).AddNewtonsoftJson(options =>
+            services.AddMvc().AddNewtonsoftJson(options =>
             {
                 options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                 options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local; // 设置时区为 UTC

+ 0 - 51
src/Masuit.MyBlogs.Core/Extensions/MyExceptionFilter.cs

@@ -1,51 +0,0 @@
-using Masuit.Tools.Logging;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.EntityFrameworkCore;
-using System;
-using System.Web;
-
-namespace Masuit.MyBlogs.Core.Extensions
-{
-    public class MyExceptionFilter : ExceptionFilterAttribute
-    {
-        /// <inheritdoc />
-        public override void OnException(ExceptionContext context)
-        {
-            base.OnException(context);
-            string err;
-            var req = context.HttpContext.Request;
-            var ip = context.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
-            switch (context.Exception)
-            {
-                case DbUpdateConcurrencyException ex:
-                    err = $"异常源:{ex.Source},异常类型:{ex.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(req.Path)},客户端用户代理:{req.Headers["User-Agent"]},客户端IP:{ip}\t{ex.InnerException?.Message}\t";
-                    LogManager.Error(err, ex);
-                    break;
-                case DbUpdateException ex:
-                    err = $"异常源:{ex.Source},异常类型:{ex.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(req.Path)},客户端用户代理:{req.Headers["User-Agent"]},客户端IP:{ip}\t{ex?.InnerException?.Message}\t";
-                    LogManager.Error(err, ex);
-                    break;
-                case AggregateException ex:
-                    LogManager.Debug("↓↓↓" + ex.Message + "↓↓↓");
-                    ex.Handle(e =>
-                    {
-                        LogManager.Error($"异常源:{e.Source},异常类型:{e.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(req.Path)},客户端用户代理:{req.Headers["User-Agent"]},客户端IP:{ip}\t", e);
-                        return true;
-                    });
-                    break;
-                case NotFoundException _:
-                    context.Result = new RedirectToActionResult("Index", "Error", new { });
-                    context.ExceptionHandled = true;
-                    return;
-                default:
-                    LogManager.Error($"异常源:{context.Exception.Source},异常类型:{context.Exception.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(req.Path)},客户端用户代理:{req.Headers["User-Agent"]},客户端IP:{ip}\t", context.Exception);
-                    break;
-            }
-#if !DEBUG
-            context.Result = new RedirectToActionResult("ServiceUnavailable", "Error", null);
-            context.ExceptionHandled = true;
-#endif
-        }
-    }
-}

+ 1 - 1
src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.csproj

@@ -28,7 +28,7 @@
         <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="7.0.0" />
         <PackageReference Include="CacheManager.Microsoft.Extensions.Caching.Memory" Version="2.0.0-beta-1629" />
         <PackageReference Include="CacheManager.Serialization.Json" Version="2.0.0-beta-1629" />
-        <PackageReference Include="CSRedisCore" Version="3.3.0" />
+        <PackageReference Include="CSRedisCore" Version="3.4.0" />
         <PackageReference Include="DocxToHtml" Version="1.0.4" />
         <PackageReference Include="EFSecondLevelCache.Core" Version="2.9.1" />
         <PackageReference Include="Hangfire" Version="1.7.9" />

+ 4 - 11
src/Masuit.MyBlogs.Core/Startup.cs

@@ -30,7 +30,6 @@ using Microsoft.AspNetCore.WebSockets;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
 using Microsoft.Extensions.Primitives;
 using Microsoft.Net.Http.Headers;
 using StackExchange.Profiling;
@@ -39,6 +38,7 @@ using System.IO;
 using System.Linq;
 using System.Net.Http;
 using System.Threading.Tasks;
+using Microsoft.Extensions.FileProviders;
 using IWebHostEnvironment = Microsoft.AspNetCore.Hosting.IWebHostEnvironment;
 using SameSiteMode = Microsoft.AspNetCore.Http.SameSiteMode;
 
@@ -158,15 +158,8 @@ namespace Masuit.MyBlogs.Core
         public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DataContext db, IHangfireBackJob hangfire, LuceneIndexerOptions luceneIndexerOptions)
         {
             app.UseForwardedHeaders().UseCertificateForwarding(); // X-Forwarded-For
+            app.UseExceptionHandler("/ServiceUnavailable");
             ServiceProvider = app.ApplicationServices;
-            if (env.IsDevelopment())
-            {
-                app.UseDeveloperExceptionPage();
-            }
-            else
-            {
-                app.UseExceptionHandler("/Home/Error");
-            }
 
             //db.Database.Migrate();
             var dic = db.SystemSetting.ToDictionary(s => s.Name, s => s.Value); //初始化系统设置参数
@@ -180,8 +173,8 @@ namespace Masuit.MyBlogs.Core
             {
                 app.UseHttpsRedirection().UseRewriter(new RewriteOptions().AddRedirectToNonWww()); // URL重写
             }
-
-            app.UseStaticFiles(new StaticFileOptions //静态资源缓存策略
+            
+            app.UseDefaultFiles().UseStaticFiles(new StaticFileOptions //静态资源缓存策略
             {
                 OnPrepareResponse = context =>
                 {