ASP.NET CORE之中间件-自定义异常中间件
1、一般Asp.Net Core 创建项目后 StartUp文件中存在 StartUp、ConfigureServices 、Configure 函数或方法
2、中间件一般在Configure中配置或启用
不多说了,直接操作
一、创建项目(.NetCore 3.1)
建议创建API项目便于后续测试验证,因为本人只是Demo创建一个空API显得更为整洁

创建完成后StartUp类
public class Startup { // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Hello World!"); }); }); } }
2、创建扩展类、中间件、结果类
Extension
public static class ApplicationBuilderExtensions { public static IApplicationBuilder UseExceptionHandle(this IApplicationBuilder app) { app.UseMiddleware<ExceptionHandleMiddleware>();//UseMiddleware添加中间件 return app; } }
Middleware
public class ExceptionHandleMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public ExceptionHandleMiddleware( RequestDelegate next, ILogger<ExceptionHandleMiddleware> logger) { _next = next; _logger = logger; } public async Task InvokeAsync(HttpContext httpContext) { try { await _next(httpContext); } catch (Exception ex) { await HandleExceptionAsync(httpContext, ex); } } private Task HandleExceptionAsync(HttpContext context, Exception exception) { context.Response.ContentType = "application/json"; context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; var error = exception.ToString(); _logger.LogError(error); return context.Response.WriteAsync(JsonConvert.SerializeObject(ResultModel.Failed(error), new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() })); } }
IResult
/// <summary> /// 返回结果模型接口 /// </summary> public interface IResultModel { /// <summary> /// 是否成功 /// </summary> [JsonIgnore] bool Successful { get; } /// <summary> /// 错误 /// </summary> string Msg { get; } } /// <summary> /// 返回结果模型泛型接口 /// </summary> /// <typeparam name="T"></typeparam> public interface IResultModel<T> : IResultModel { /// <summary> /// 返回数据 /// </summary> T Data { get; } }
Result
/// <summary> /// 返回结果 /// </summary> public class ResultModel<T> : IResultModel<T> { /// <summary> /// 处理是否成功 /// </summary> [JsonIgnore] public bool Successful { get; private set; } /// <summary> /// 错误信息 /// </summary> public string Msg { get; private set; } /// <summary> /// 状态码 /// </summary> public int Code => Successful ? 1 : 0; /// <summary> /// 返回数据 /// </summary> public T Data { get; private set; } /// <summary> /// 成功 /// </summary> /// <param name="data">数据</param> /// <param name="msg">说明</param> public ResultModel<T> Success(T data = default, string msg = "success") { Successful = true; Data = data; Msg = msg; return this; } /// <summary> /// 失败 /// </summary> /// <param name="msg">说明</param> public ResultModel<T> Failed(string msg = "failed") { Successful = false; Msg = msg; return this; } } /// <summary> /// 返回结果 /// </summary> public static class ResultModel { /// <summary> /// 成功 /// </summary> /// <param name="data">返回数据</param> /// <returns></returns> public static IResultModel Success<T>(T data = default(T)) { return new ResultModel<T>().Success(data); } /// <summary> /// 成功 /// </summary> /// <returns></returns> public static IResultModel Success() { return Success<string>(); } /// <summary> /// 失败 /// </summary> /// <param name="error">错误信息</param> /// <returns></returns> public static IResultModel Failed<T>(string error = null) { return new ResultModel<T>().Failed(error ?? "failed"); } /// <summary> /// 失败 /// </summary> /// <returns></returns> public static IResultModel Failed(string error = null) { return Failed<string>(error); } /// <summary> /// 根据布尔值返回结果 /// </summary> /// <param name="success"></param> /// <returns></returns> public static IResultModel Result<T>(bool success) { return success ? Success<T>() : Failed<T>(); } /// <summary> /// /// </summary> /// <param name="success"></param> /// <returns></returns> public static IResultModel Result(bool success) { return success ? Success() : Failed(); } /// <summary> /// 数据已存在 /// </summary> /// <returns></returns> public static IResultModel HasExists => Failed("数据已存在"); /// <summary> /// 数据不存在 /// </summary> public static IResultModel NotExists => Failed("数据不存在"); }
到此中间件已经添加完成
作者:刘涛(Bill)
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个无耻的文档搬运工!
分类:
.net core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫