用.net core实现反向代理中间件
最近在将一些项目的rest api迁移到.net core中,最开始是用的Nginx做反向代理,将已经完成切换的部分切入系统,如下图所示:

由于迁移过程中也在进行代码重构,需要经常比较频繁的测试,以保证能及时发现引入的问题。从而导致我们每迁移一部分都需要配置一次nginx的路由映射,保证迁移的功能能切入系统测试。
进行了一段时间后,发现经常配置Nginx一来比较麻烦,二来容易配错;便想将这个反向代理的功能放在.net core程序中去,实现如下的功能:
- Rest请求直接发往.net core程序
- 如果该请求在.net core程序中实现,则执行请求并返回
- 如果未实现,将其请求老版接口的数据,并返回结果。
形成如下的一个结构:

试了一下,在.net core中实现这个功能比较简单,加一个反向代理的中间件即可:
public class ReverseProxy
{
static HttpClient _http = new HttpClient(); public static async Task Invoke(HttpContext context)
{
var url = context.Request.Path.ToUriComponent();
var uri = new Uri("http://localhost:8080/api" + url); var request = CopyRequest(context, uri);
var remoteRsp = await _http.SendAsync(request);
var rsp = context.Response; foreach (var header in remoteRsp.Headers)
{
rsp.Headers.Add(header.Key, header.Value.ToArray());
} rsp.ContentType = remoteRsp.Content.Headers.ContentType?.ToString();
rsp.ContentLength = remoteRsp.Content.Headers.ContentLength; await remoteRsp.Content.CopyToAsync(rsp.Body);
} static HttpRequestMessage CopyRequest(HttpContext context, Uri targetUri)
{
var req = context.Request;
var requestMessage = new HttpRequestMessage()
{
Method = new HttpMethod(req.Method),
Content = new StreamContent(req.Body),
RequestUri = targetUri,
}; foreach (var header in req.Headers)
{
requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray());
} requestMessage.Headers.Host = targetUri.Host; return requestMessage;
}
}
使用起来也比较简单,放在Configure函数的最后面,直接使用Run来反向代理所有未被系统实现的请求即可。
app.Run(Middleware.ReverseProxy.Invoke);
这里我这只是一个比较简单的实现,大概就二三十行代码,也不是很完善,但试了一下,基本要的功能也都有,网上也有一些第三方框架可ProxyKit以使用。
用.net core实现反向代理中间件的更多相关文章
- .NET 反向代理-YARP 部署Https(SSL)
YARP 作为反向代理中间件,那就无可避免需要使用到 Https 去部署项目,那 YARP 要怎么去实现呢,本来以为 YARP 会有一套自己的实现,在翻阅了资料后发现,根本不是我想的那样,按照 YAR ...
- .NET 反向代理 YARP 跨域请求 CORS
使用过 nginx 的小伙伴应该都知道,这个中间件是可以设置跨域的,作为今天的主角,同样的 反向代理中间件的 YARP 毫无意外也支持了跨域请求设置. 有些小伙伴可能会问了,怎样才算是跨域呢? 在 H ...
- 【Asp.net Core】在 Linux 子系统中安装 nginx 并配置反向代理
上一篇鸟文中,老周已经介绍过在 Ubuntu 子系统中安装 dotnet-sdk 的方法,本文老周给大伙伴们说说安装 nginx 服务,并配置反向代理.同样,老周假设你从来没有用过 Linux,所以老 ...
- .Net Core实践4 web 反向代理
目标 将控制台程序改成web程序,通过IIS反向代理,处理请求 环境 win10 / .net core 2.1 / centos7 变成web程序 1.在新建的asp.net core控制台程序中添 ...
- ASP.NET Core 反向代理部署知多少
引言 最近在折腾统一认证中心,看到开源项目IdentityServer4.Admin集成了IdentityServer4和管理面板,就直接拿过来用了.在尝试Nginx部署时遇到了诸如虚拟目录映射,请求 ...
- [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问
前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...
- Linux+.Net Core+Nginx(在Linux上使用Nginx反向代理.Net Core 项目)
Linux+.Net Core+Nginx 之前的文章中有提到关于使用Nginx在linux来实现反向代理,今天我们继续加点料.在Centos7中部署.NetCore,然后使用Nginx进行反向代理! ...
- [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问
前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...
- 【netcore基础】CentOS 7.6.1810 搭建.net core 2.1 linux 运行环境 nginx反向代理 supervisor配置自启动
之前写过一篇Ubuntu的环境搭建博客,感觉一些配置大同小异,这里重点记录下 nginx 作为静态 angular 项目文件服务器的配置 参考链接 [netcore基础]ubuntu 16.04 搭建 ...
随机推荐
- 日记o3o
12.17 段考超级烂,连sts都没考过,但是今晚来机房,nj发邮件的时候也给我发了,看来是可以继续学竞赛啦,很快心,也挺不开心的,毕竟以后想要跟上文化课就要很努力了,有能力但是得去花时间啊,寒假又要 ...
- Windows10安装ubuntu18.04双系统教程
写在前面:本教程为windows10安装ubuntu18.04(64位)双系统教程,是我多次安装双系统的经验总结,安装方法同样适用于ubuntu16.04(64位).为了直观和易于理解,我会尽量图文并 ...
- Leetcode题解 - BFS部分题目代码+思路(896、690、111、559、993、102、103、127、433)
和树有关的题目求深度 -> 可以利用层序遍历 -> 用到层序遍历就想到使用BFS 896. 单调数列 - 水题 class Solution: def isMonotonic(self, ...
- plantuml-绘制状态图和活动图和部署图
背景 状态图:对象的所有状态,以及基于事件发生的状态改变的过程: 活动图:用例的工作流程: 部署图:系统的软硬件物理体系结构: 状态图 基本语法 元素 语法 说明 开始和结束状态 [*] 标识开始和结 ...
- Docker for Java Developers
1. 基本概念 1.1. 主要组件 Docker有三个主要组件: 镜像是Docker的构建组件,而且是定义应用程序操作系统的只读模板 容器是Docker的运行组件,它是从镜像创建的.容器可以运行. ...
- 前端深入之js篇丨Array数组操作从入门到成神Up Up Up,持续更新中
写在前面 随着前端深入的不断学习,发现数组这个数据结构在前端中有着相当大的存在感,由于我初学前端的时候并没有系统性的学习数组,所以我将通过这篇文章同你一起学习数组,希望我们能一起进步,学会熟练操作数组 ...
- 关于scrapy中scrapy.Request中的属性
一.源码 def __init__(self, url, callback=None, method='GET', headers=None, body=None, cookies=None, met ...
- 通过C#代码调用Dynamics 365 Web API执行批量操作
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Python 變量 Variable 動態綁定
為何 Python 變量沒有 Data Type 概念 ? 可以與任意 Data Type 綁定? Python 變量 Variable 與其他程式語言不同之處在於: > variable 不是 ...
- 【Gradle】Groovy基础
Groovy基础 Groovy是基于JVM虚拟机的一种动态语言.每个Gradle的build脚本文件都是一个Groovy脚本文件. 字符串 在Groovy中,分号不是必需的.在Groovy中,单引号和 ...