自定义 ocelot 中间件输出自定义错误信息

自定义 ocelot 中间件输出自定义错误信息

Intro

ocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候就需要做一些自定义了,对 ocelot 中的 Response 中间件做了一些小改动,实现了输出自定义错误信息的功能。

Implement

实现起来其实也很简单,原来的有错误的时候,只设置了 Response 的 StatusCode,我们只需要加一下输出错误信息就可以了,错误信息的格式完全可以自定义,实现代码如下:

public class CustomResponseMiddleware : Ocelot.Middleware.OcelotMiddleware
{private readonly RequestDelegate _next;private readonly IHttpResponder _responder;private readonly IErrorsToHttpStatusCodeMapper _codeMapper;public CustomResponseMiddleware(RequestDelegate next,IHttpResponder responder,IErrorsToHttpStatusCodeMapper codeMapper,IOcelotLoggerFactory loggerFactory): base(loggerFactory.CreateLogger<UrlBasedAuthenticationMiddleware>()){_next = next;_responder = responder;_codeMapper = codeMapper;}public async Task Invoke(HttpContext httpContext){await _next.Invoke(httpContext);if (httpContext.Response.HasStarted)return;var errors = httpContext.Items.Errors();if (errors.Count > 0){Logger.LogWarning($"{errors.ToErrorString()} errors found in {MiddlewareName}. Setting error response for request path:{httpContext.Request.Path}, request method: {httpContext.Request.Method}");var statusCode = _codeMapper.Map(errors);var error = string.Join(",", errors.Select(x => x.Message));httpContext.Response.StatusCode = statusCode;// output errorawait httpContext.Response.WriteAsync(error);}else{Logger.LogDebug("no pipeline errors, setting and returning completed response");var downstreamResponse = httpContext.Items.DownstreamResponse();await _responder.SetResponseOnHttpContext(httpContext, downstreamResponse);}}
}

相比之前的中间件,主要变化就是对于 Error 的处理,感觉这里 ocelot 可以抽象一下,增加一个接口 ErrorResponser 之类的,现在的 responder 没有直接把错误信息直接传进去造成一些不变,加一个 ErrorResponder 只处理 Error 相关的逻辑,把错误信息直接传进去,这样用户也就可以更为灵活的注册自己的服务来无侵入的修改发生错误时的行为

Sample

要使用这个中间件,就要自己定义 ocelot 中间件的配置,把默认的 Response 中间件替换成自己的中间件即可,示例如下:

app.UseOcelot((ocelotBuilder, ocelotConfiguration) =>
{// this sets up the downstream context and gets the configapp.UseDownstreamContextMiddleware();// This is registered to catch any global exceptions that are not handled// It also sets the Request Id if anything is set globallyocelotBuilder.UseExceptionHandlerMiddleware();// This is registered first so it can catch any errors and issue an appropriate response//ocelotBuilder.UseResponderMiddleware();ocelotBuilder.UseMiddleware<CustomResponseMiddleware>();ocelotBuilder.UseDownstreamRouteFinderMiddleware();ocelotBuilder.UseMultiplexingMiddleware();ocelotBuilder.UseDownstreamRequestInitialiser();ocelotBuilder.UseRequestIdMiddleware();// 自定义中间件,模拟没有权限的情况ocelotBuilder.Use((ctx, next) =>{ctx.Items.SetError(new UnauthorizedError("No permission"));return Task.CompletedTask;});//ocelotBuilder.UseMiddleware<UrlBasedAuthenticationMiddleware>();ocelotBuilder.UseLoadBalancingMiddleware();ocelotBuilder.UseDownstreamUrlCreatorMiddleware();ocelotBuilder.UseHttpRequesterMiddleware();
}).Wait();

除了上面的 Response 中间件,为了测试方便,我还加了一个中间件,直接设置了一个 Error 来方便测试,随便访问一个 Path 来测试一下是不是会有错误信息,可以看到正如预期的结果一样,输出了我们自定义的错误信息

More

完整示例可以从 Github 上获取 https://github.com/WeihanLi/AspNetCorePlayground/tree/master/OcelotDemo

Reference

  • https://github.com/WeihanLi/AspNetCorePlayground/blob/master/OcelotDemo/OcelotMiddleware/CustomResponseMiddleware.cs

  • https://github.com/WeihanLi/AspNetCorePlayground/tree/master/OcelotDemo

  • https://github.com/ThreeMammals/Ocelot/blob/17.0.0/src/Ocelot/Responder/HttpContextResponder.cs

  • https://github.com/ThreeMammals/Ocelot/blob/17.0.0/src/Ocelot/Responder/Middleware/ResponderMiddleware.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盘点小坏蛋的礼物

我们家小坏蛋一天天长大了&#xff0c;妈妈从觉得很辛苦过渡到习惯了很辛苦&#xff0c;苦中作乐的妈妈终于抽出空来写博客啦&#xff01; 为什么叫他小坏蛋呢&#xff1f;因为他吃饭不乖。没满月的时候蛮乖的&#xff0c;每顿奶都吃的很香&#xff0c;咕咚咕咚的喝下去&#x…

为什么对gRPC做负载均衡会很棘手?

在过去的几年中&#xff0c;随着微服务的增长&#xff0c;gRPC在这些较小的服务之间的相互通信中获得了很大的普及,在后台&#xff0c;gRPC使用http/2在同一连接和双工流中复用许多请求。使用具有结构化数据的快速&#xff0c;轻便的二进制协议作为服务之间的通信介质确实很有吸…

给新手程序猿的16个必备小妙招

写在前面&#xff1a; 这个文章核心并不是程序优化的具体技巧&#xff0c;而是拿到一个问题如何思考和利用工具的通用方法。比如即使我们不知道 profiler 这个东西&#xff0c;通过搜索"代码 每一行 时间"也可以很快知道有这样的工具叫做 profiler&#xff0c;并且学…

python字符串设置字体_python怎么更改字符串后几位

python更改字符串后几位的方法&#xff1a;可以利用replace()函数来实现。replace()函数可以把字符串中的旧字符串替换成新字符串&#xff0c;并返回替换后的新字符串。具体使用方法如&#xff1a;【str.replace("is", "was")】。可以利用replace()函数来修…

程序猿的双十一最佳攻略

讲个恐怖故事 一年一度虐汪“光棍节”又来了 小天拍拍&#xff08;不存在的&#xff09;胸脯告诉大家 这个节日 我陪你们 买买买&#xff01; 限时特惠专场 1 welcome 7天教你学会数学建模及Matlab编程 数学建模涉及的内容比较广泛&#xff0c;比如碎纸片问题中所涉及的图像识…

关于Word中审阅的一个问题!

前两天&#xff0c;在帮一个杂志撰稿的过程中&#xff0c;有一个关于Word审阅的问题。&#xff08;以下内容以Word2007为例&#xff09; 本身&#xff0c;审阅的应用不算困难。 我们可以为文章添加“批注”&#xff0c;或是你的上级对文章进行修改&#xff0c;他们可以开启“审…

ASP.NET Core - 在ActionFilter中使用依赖注入

上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的&#xff0c;所以花了点时间仔细阅读了微软的官方文档。发现除了IActionFilter、IAsyncActionFilter的问题&#xff0c;还有一个就是依赖注入在ActionFilter上的使用也是需要注意的…

魏尔斯特拉斯函数与分形图形的动画演示

一般人会直觉上认为连续的函数必然是近乎可导的。即使不可导&#xff0c;所谓不可导的点也必然只占整体的一小部分。根据魏尔斯特拉斯在他的论文中所描述&#xff0c;早期的许多数学家&#xff0c;包括高斯&#xff0c;都曾经假定连续函数不可导的部分是有限或可数的。这可能是…

大脚战场插件怎么关闭_PM工具栏插件:HonmToolBar

视频演示&#xff1a;问&#xff1a;HonmToolBar是一款什么样的插件&#xff1f;答&#xff1a;HonmToolBar是一款高度自由化的插件&#xff0c;用户可以自己增加宏文件按钮或者宏命令按钮。该插件类似工具栏&#xff0c;有水平和垂直两个工具栏。插件悬浮在PM图形窗口左上角&a…

android 导航 美国,变美了 Android N或用全新虚拟导航按键

原标题&#xff1a;变美了 Android N或用全新虚拟导航按键变美了 Android N或用全新虚拟导航按键【IT168 资讯】虽然距离谷歌Android N系统的发布已经有一段时间了&#xff0c;不过该系统目前仍旧属于内测阶段&#xff0c;短时间内仍难以迅速推广。另外也正是由于Android N正式…

python特性和属性_Python面向对象-类的特性及公私有属性 | 【韩涛博客】

构造函数 __init__ self.name name #属性&#xff0c;成员变量&#xff0c;字段 def sayhi() #方法&#xff0c;动态属性 公有属性 在类中直接定义的属性&#xff0c;大家都可以用 私有属性 __两个下划线定义&#xff0c;外部不可以访问&#xff0c;内部可以访问 class Role(o…

[Abp 源码分析]自动审计记录

点击上方蓝字关注我们0.简介Abp 框架为我们自带了审计日志功能&#xff0c;审计日志可以方便地查看每次请求接口所耗的时间&#xff0c;能够帮助我们快速定位到某些性能有问题的接口。除此之外&#xff0c;审计日志信息还包含有每次调用接口时客户端请求的参数信息&#xff0c;…

我的老公是枚码农

前两天看到一篇写程序员的爆文&#xff0c;虽然略显夸张&#xff0c;但也着实有趣。忽然想到身边人也是一枚码农&#xff0c;浑身上下也是浓厚的码农气息&#xff0c;遂也胡乱写了几笔&#xff0c;博君一笑&#xff0c;为了方便起见&#xff0c;就称其为“码农哥”。 1 码农哥还…

harmonyos con,鸿蒙HarmonyOS系统中的JS开发框架

HarmonyOS开源至今已经一个多月&#xff0c;源码托管在国内知名开源平台码云上&#xff0c;https://gitee.com/openharmony 。我最感兴趣的就是JS 框架 ace_lite_jsfwk&#xff0c;从名字中可以看出来这是一个非常轻量级的框架&#xff0c;官方介绍说是“轻量级 JS 核心开发框架…

.NET工资低?那肯定是你打开的方式不正确

点击上方蓝字关注我们因为工作的关系&#xff0c;本人总是会接触到一些刚踏入社会没多久的.NET开发小伙伴。尤其是年关将近&#xff0c;这时候想要跳槽的人特别多&#xff0c;所以收到一些小伙伴的迷茫求解。今天就拿其中一个来说&#xff0c;我们暂且称他为A同学吧。A同学是一…

10分钟读懂人工智能、机器学习到底有什么关系

文末彩蛋&#xff0c;错过哭一年。。。。 人工智能的浪潮正在席卷全球&#xff0c;诸多词汇时刻萦绕在我们耳边&#xff1a;人工智能&#xff08;Artificial Intelligence&#xff09;、机器学习&#xff08;Machine Learning&#xff09;。不少人对这些高频词汇的含义及其背后…

苏泊尔搭载华为鸿蒙系统,华为鸿蒙打算在一年内跨过生死线,拿下16%的市场份额...

原标题&#xff1a;华为鸿蒙打算在一年内跨过生死线&#xff0c;拿下16%的市场份额华为鸿蒙操作系统发布已经有一段时间了&#xff0c;这个操作系统直到上个月月底才开启了公测&#xff0c;很多用户都已经使用上了华为的这个鸿蒙操作系统。根据不少用户的反馈情况来看&#xff…

python获取系统时间函数_简单记录python的时间函数操作

1. time和datetime模块 import datetime,time 2. 获得当前时间 time.time() #获得当前时间&#xff0c;返回float型 time.localtime([float time]) #获得本地当前时间&#xff0c;返回time.struct_time类型 说明&#xff1a;struct_time是一个只读的9元组&#xff0c;其中参数命…

10个最佳的大数据处理编程语言

大数据的浪潮仍在继续。它渗透到了几乎所有的行业&#xff0c;信息像洪水一样地席卷企业&#xff0c;使得软件越发庞然大物&#xff0c;比如Excel看上去就变得越来越笨拙。数据处理不再无足轻重&#xff0c;并且对精密分析和强大又实时处理的需要变得前所未有的巨大。 那么&…

再记一次 应用服务器 CPU 暴高事故分析

一&#xff1a;背景 1. 前言大概有2个月没写博客了&#xff0c;不是不想写哈????&#xff0c;关注公号的朋友应该知道我这两个月一直都在翻译文章&#xff0c;前前后后大概100篇左右吧&#xff0c;前几天看公号的 常读用户 降了好几十&#xff0c;心疼哈&#xff0c;还得回…