ASP.NET CORE之中间件-自定义异常中间件
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!");
});
});
}
}
public static class ApplicationBuilderExtensions
{
public static IApplicationBuilder UseExceptionHandle(this IApplicationBuilder app)
{
app.UseMiddleware<ExceptionHandleMiddleware>();//UseMiddleware添加中间件
return app;
}
}
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()
}));
}
}
/// <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; }
}
/// <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 ? : ;
/// <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("数据不存在");
}
ASP.NET CORE之中间件-自定义异常中间件的更多相关文章
- 在ASP.NET Core 中使用Cookie中间件
在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...
- asp.net core mvc 管道之中间件
asp.net core mvc 管道之中间件 http请求处理管道通过注册中间件来实现各种功能,松耦合并且很灵活 此文简单介绍asp.net core mvc中间件的注册以及运行过程 通过理解中间件 ...
- 在ASP.NET Core 中使用Cookie中间件 (.net core 1.x适用)
在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...
- Asp.Net Core入门之自定义中间件
什么是中间件? 这里引用官方解释: 中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每一个组件都可以选择是否将请求交给下一个组件.并在管道中调用下一个组件之前和之后执行某些操作.请求委托被 ...
- asp.net core 3.1 自定义中间件实现jwt token认证
asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...
- ASP.NET Core 使用 URL Rewrite 中间件实现 HTTP 重定向到 HTTPS
在传统 ASP.NET 程序中,我们可以通过配置 IIS 的“URL 重写”功能实现将 HTTP 请求重定向为 HTTPS .但是该方法在 ASP.NET Core 应用中不再工作.在 ASP.NET ...
- asp.net core中写入自定义中间件
首先要明确什么是中间件?微软官方解释:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?tabs=aspnet ...
- ASP.NET Core 2.2在中间件内使用有作用域的服务
服务生存期 为每个注册的服务选择适当的生存期.可以使用以下生存期配置ASP.NET Core服务: 暂时 暂时生存期服务 (AddTransient) 是每次从服务容器进行请求时创建的. 这种生存期适 ...
- ASP.NET CORE 管道模型及中间件使用解读
说到ASP.NET CORE 管道模型不得不先来看看之前的ASP.NET 的管道模型,两者差异很大,.NET CORE 3.1 后完全重新设计了框架的底层,.net core 3.1 的管道模型更加灵 ...
随机推荐
- SpringMVC整合mybaitis
目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六.完成Spring整合MyBatis配置 七.创建服务 ...
- 手把手教你利用Docker+jenkins部署你的网站
更新服务器的安装源为阿里的源,参考链接:https://blog.csdn.net/js_xh/article/details/79166655 安装docker; 1 更新资源 sudo apt-g ...
- SpringCloud与Eureka,Feign,Ribbon,Hystrix,Zuul核心组件间的关系
Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在 ...
- Linux上的Systemctl命令
LinuxSystemctl是一个系统管理守护进程.工具和库的集合,用于取代System V.service和chkconfig命令,初始进程主要负责控制systemd系统和服务管理器.通过Syste ...
- 黎活明8天快速掌握android视频教程--25_网络通信之资讯客户端
1 该项目的主要功能是:后台通过xml或者json格式返回后台的视频资讯,然后Android客户端界面显示出来 首先后台新建立一个java web后台 采用mvc的框架 所以的servlet都放在se ...
- Refresh Java
当你的知识来源于实践, 你可能会忽略很多细节. 当你的知识来源于阅读, 你可能会很快的忘掉. 那么, 不如在空闲之余, 浏览一遍, 把觉得有必要的记录下来, 也便于以后温故而知新, 何乐而不为呢? 于 ...
- 【Spring】@Transactional 闲聊
菜瓜:上次的AOP理论知识看完收获挺多的,虽然有一个自定义注解的demo,但还是觉得差点东西 水稻:我也觉得没有跟一遍源码还是差点意思,这次结合@Transactional注解深入源码看一下 菜瓜:事 ...
- java命令行输入参数
Java命令行输入参数 代码用例:命令行输入参数,并进行加法运算. public class Demo01 { public static void main(String[] args) { for ...
- python在循环中追加字典
1. 在循环中用append增加key值,最终生成全是key值的list: 2. 在循环中用append增加value值,最终生成全是value值的list: 3. 最后用zip将两个list合并成一 ...
- js事件入门(5)
5.窗口事件 5.1.onload事件 元素加载完成时触发,常用的就是window.onload window.onload = function(){ //等页面加载完成时执行这里的代码 } 5.1 ...