利用.net core实现反向代理中间件的方法

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

由于迁移过程中也在进行代码重构,需要经常比较频繁的测试,以保证能及时发现引入的问题。从而导致我们每迁移一部分都需要配置一次nginx的路由映射,保证迁移的功能能切入系统测试。

进行了一段时间后,发现经常配置Nginx一来比较麻烦,二来容易配错;便想将这个反向代理的功能放在.net core程序中去,实现如下的功能:

  1. Rest请求直接发往.net core程序
  2. 如果该请求在.net core程序中实现,则执行请求并返回
  3. 如果未实现,将其请求老版接口的数据,并返回结果。

形成如下的一个结构:

试了一下,在.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);

这里我这只是一个比较简单的实现,大概就二三十行代码,也不是很完善,但试了一下,基本要的功能也都有,感兴趣的朋友可以将其完善下,这个功能本身也只是一个过渡期使用的功能,后续使用过程中如果有更新也会放上来。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • 详解ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是Microsoft.AspNetCore.ResponseCompression 和 Microsoft.AspNetCore.ResponseCaching , 下面让我们一起看看的功能以及如何去使用吧. Getting Started Microsoft.AspNetCore.ResponseCompression Microsoft.AspNetCo

  • ASP.NET Core 2.0 带初始参数的中间件问题及解决方法

    问题 如何在ASP.NET Core 2.0向中间件传入初始参数? 答案 在一个空项目中,创建一个POCO(Plain Old CLR Object)来保存中间件所需的参数: public class GreetingOptions { public string GreetAt { get; set; } public string GreetTo { get; set; } } 添加一个中间件: public class GreetingMiddleware { private readon

  • .Net Core中间件之静态文件(StaticFiles)示例详解

    一.介绍 静态文件(static files),诸如 HTML.CSS.图片和 JavaScript 之类的资源会被 ASP.NET Core 应用直接提供给客户端. 在介绍静态文件中间件之前,先介绍 ContentRoot和WebRoot概念. ContentRoot:指web的项目的文件夹,包括bin和webroot文件夹. WebRoot:一般指ContentRoot路径下的wwwroot文件夹. 介绍这个两个概念是因为静态资源文件一般存放在WebRoot路径下,也就是wwwroot.下面

  • 浅谈ASP.NET Core 中间件详解及项目实战

    前言 本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World. 中间件(Middleware)的作用 我们知道,任何的一个web框架都是把http请求封装成一个管道,每一次的请求都是经过管道的一系列操作,最终到达我们写的代码中.那么中间件就是在应用程序管道中的一个组件,用来拦截请求过程进行一些其他处理和响应.中间件可以有很多个,每一个中间件都可以对管道中的请求进行拦截,它可以决定是否将请求转移给下一个中间件. asp.net

  • 详解在ASP.NET Core 中使用Cookie中间件

    在 http:// ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分配到HttpContext对象的User属性中.如果你想提供自己的登录方式和用户数据你可以使用Cookie中间件来实现独立的功能. 添加和配置 第一步是增加Cookie中间件到你的应用中.首先使用nuget增加Microsoft.AspNetCore.Authentication.

  • .Net Core Cors中间件的深入讲解

    同源策略和资源跨域共享 1.同源策略 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同. 1.1.目的 主要是为了保证用户信息的安全,防止网站窃取用户数据.假如没有同源策略,可能就会有下面这种情况的发生.用户访问两个网站A/B,并登录了A网站,A网站会在计算机本地存储Cookie或者Token等等,在访问B网站的时候,B网站就可以访问这些本地的存储信息,B网站可以使用用户的Cookie去登录A

  • Asp.Net Core 通过中间件防止图片盗链的实例

    一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件.换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址.有了referer跟踪来源就好办了,这时就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面.如果想对自己的网站进行防盗链保护,则需要针对不同的情况进行区

  • 浅谈ASP.NET Core中间件实现分布式 Session

    1.1. 中间件原理 1.1.1. 什么是中间件 中间件是段代码用于处理请求和响应,通常多个中间件链接起来形成管道,由每个中间件自己来决定是否要调用下一个中间件. 1.1.2. 中间件执行过程 举一个示例来演示中间件的执行过程(分别有三个中间件:日志记录.权限验证和路由):当请求进入应用程序时,执行执行日志记录的中间件,它记录请求属性并调用链中的下一个中间件权限验证,如果权限验证通过则将控制权传递给下一个中间件,不通过则设置401 HTTP代码并返回响应,响应传递给日志中间件进行返回. 1.1.

  • 利用.net core实现反向代理中间件的方法

    最近在将一些项目的rest api迁移到.net core中,最开始是用的Nginx做反向代理,将已经完成切换的部分切入系统,如下图所示: 由于迁移过程中也在进行代码重构,需要经常比较频繁的测试,以保证能及时发现引入的问题.从而导致我们每迁移一部分都需要配置一次nginx的路由映射,保证迁移的功能能切入系统测试. 进行了一段时间后,发现经常配置Nginx一来比较麻烦,二来容易配错:便想将这个反向代理的功能放在.net core程序中去,实现如下的功能: Rest请求直接发往.net core程序

  • 利用node.js实现反向代理的方法详解

    本文主要给大家介绍的是关于利用node.js实现反向代理的相关内容,分享出供大家参考学习,下面话不多说,来一起看看详细的介绍: 跨域问题是前端开发很常见的问题解决方案有很多种 jsonp返回 Access-Control-Allow-Origin:'*' (需要注意的是 对于post请求会变成option请求需求后端支持) 前端添加代理 前端添加代理 以vue-cli为例,前端添加代理 dev: { env: require('./dev.env'), port: 8888, autoOpenB

  • VueCli4项目配置反向代理proxy的方法步骤

    Vue Cli4创建项目之后,没有配置vue.config.js,如果直接发起axios请求,可能会引起跨域问题. 以豆瓣电影首页的最近热门 为例: axios({ method: "get", url: "https://movie.douban.com/j/search_subjects", params: { type: "movie", tag: "热门", page_limit: 50, page_start: 0

  • 利用SSL配置Nginx反向代理的简单步骤

    前言 反向代理是一个服务器,它接收通过Web发出的请求,即http和https,然后将它们发送到后端服务器(或服务器).后端服务器可以是单个或一组应用服务器,如Tomcat,wildfly或Jenkins等,或者甚至可以是其他Web服务器,如Apache等. 我们已经讨论过如何使用Nginx配置简单的http反向代理.在本教程中,我们将讨论如何使用SSL配置Nginx反向代理.因此,让我们从使用SSL配置Nginx反向代理的过程开始. 先决条件 1.后端服务器:为了本教程的目的,我们使用在端口8

  • Nginx服务器的反向代理proxy_pass配置方法讲解

    就普通的反向代理来讲 Nginx的配置还是比较简单的,如: location ~ /* { proxy_pass http://127.0.0.1:8008; } 或者可以 location / { proxy_pass http://127.0.0.1:8008; } Apache2的反向代理的配置是: ProxyPass /ysz/ http://localhost:8080/ 然而,如果要配置一个相对复杂的反向代理 Nginx相对Apache2就要麻烦一些了 比如,将url中以/wap/开

  • Apache虚拟目录配置及vue-cli反向代理的设置方法

    配置需求来自于前后端分离.后台由于使用PHP或者Java,但是前端使用vue,React这些框架时怎么和后端有效的数据通信.反向代理是个很好的选择,虽然jsonp也可以,单并不好玩. Apache配置虚拟目录 -实际上线项目需要通过域名来访问,比如http://www.xxx.com,但在本机上如何配置虚拟域名来访问本机的项目呢? 1.找到C:\Windows\System32\drivers\etc\hosts这个文件添加以下格式内容 127.0.0.1 www.mytest.com //你的

  • 在Nginx服务器上配置Google反向代理的基本方法

    长期以来谷歌在TC一直被间歇性干扰,直至今日已经被完全屏蔽,给我们的学习和工作造成极大不便.以下为反代谷歌的教程,共有两种方式. 一.直接反向代理,使用的是7ghost源码搭建,优点是简单容易上手,缺点是容易被屏蔽,不能搜索敏感词. 二.使用SSL加密反向代理,优点是安全.不易被屏蔽,缺点是技术性相对较强,需要折腾的地方也多. 现在主要简单说下第二种方法的设置过程. Step1:你得需要有一台Linux的海外VPS. Step2:Nginx环境的建立(为了方便,教程中就用AMH一键包进行环境构建

  • 自动化Nginx服务器的反向代理的配置方法

    如果可以减少过多的外部隔离的API和简化部署的细节 这会是非常好的. 在以前的文章中,我解释了"一些使用反向代理的好处".在我目前的项目里,我们已经构建分布式面向服务的架构,也显式提供了一个HTTP API,我们使用反向代理将请求路由通过API路由给单个组件.我们选择了Nginx Web这个优秀的服务器作为我们的反向代理,它快速.可靠且易于配置.我们通过它将多个HTTP的API服务聚合到一个URL空间.举例来说,当你键入: http://api.example.com/product/

  • 快速掌握Go语言正/反向代理

    先重温一下什么叫反向代理,正向代理. 所谓正向,反向代理取决于代理的是出站请求,还是入站请求. 正向代理: 代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近.反向代理: 代理的是入站请求,客户端认为代理程序就是服务器,客户端感知不到代理逻辑,架构上距离服务端更近. 前几天利用golang实现了反向代理程序,引出了Host请求头在反代中的关键作用. 对于proxy.com的请求,都被透明无感代理到A.com package main import ( "fmt" "

  • 详解ASP.NET Core 反向代理部署知多少

    引言 最近在折腾统一认证中心,看到开源项目IdentityServer4.Admin集成了IdentityServer4和管理面板,就直接拿过来用了.在尝试Nginx部署时遇到了诸如虚拟目录映射,请求头超长.基础路径映射有误等问题,简单记录,以供后人参考. Nginx 配置路由转发 首先来看下IdentityServer4.Admin的项目结构: IdentityServer4.Admin / ├── Id4.Admin.Api # 用于提供访问Id4资源的WebApi项目 ├── Id4.Ad

随机推荐