利用.net core實現反向代理中間件的方法

 更新時間:2020-01-15 16:00:33   作者:佚名   我要評論(0)

最近在將一些項目的rest api遷移到.net core中,最開始是用的Nginx做反向代理,將已經完成切換的部分切入系統,如下圖所示:

由于遷移過程中也在進行代碼重構,需要

最近在將一些項目的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);

這里我這只是一個比較簡單的實現,大概就二三十行代碼,也不是很完善,但試了一下,基本要的功能也都有,感興趣的朋友可以將其完善下,這個功能本身也只是一個過渡期使用的功能,后續使用過程中如果有更新也會放上來。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:

  • 詳解在ASP.NET Core 中使用Cookie中間件
  • 詳解ASP.NET Core 中間件之壓縮、緩存
  • 淺談ASP.NET Core 中間件詳解及項目實戰
  • Asp.Net Core 通過中間件防止圖片盜鏈的實例
  • 淺談ASP.NET Core中間件實現分布式 Session
  • .Net Core中間件之靜態文件(StaticFiles)示例詳解
  • ASP.NET Core 2.0 帶初始參數的中間件問題及解決方法
  • .Net Core Cors中間件的深入講解

相關文章

  • 利用.net core實現反向代理中間件的方法

    利用.net core實現反向代理中間件的方法

    最近在將一些項目的rest api遷移到.net core中,最開始是用的Nginx做反向代理,將已經完成切換的部分切入系統,如下圖所示: 由于遷移過程中也在進行代碼重構,需要
    2020-01-15
  • ASP.NET MVC實現依賴注入的完整過程

    ASP.NET MVC實現依賴注入的完整過程

    前言 在java的spring中有自動注入功能,使得代碼變得更加簡潔靈活,所以想把這個功能移植到c#中,接下來逐步分析實現過程 1.使用自動注入場景分析 在asp.net mvc中,
    2020-01-15
  • .NET資源泄露與處理方案知識點分享

    .NET資源泄露與處理方案知識點分享

    .NET雖然擁有強大易用的垃圾回收機制,但并不是因為這樣,你就可以對資源管理放任不管,其實在稍不注意的時候,可能就造成了資源泄露,甚至因此導致系統崩潰,到那時
    2020-01-15
  • asp.net大文件上傳解決方案實例代碼

    asp.net大文件上傳解決方案實例代碼

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 構建前端頁面,用 Axios 從前端訪問后端 API ,包括文件的上傳和下載。 準備文件上傳的API #region 文件上傳 可以帶參
    2020-01-15
  • .Net Core讀取Json配置文件的實現示例

    .Net Core讀取Json配置文件的實現示例

    前言:在與傳統的asp.net MVC項目相比,.net core項目在項目目錄的文件結構上和功能上與前者都有很大的區別。例如:在.net core中使用Startup.cs取代Global.asax文件
    2020-01-15
  • .net core部署到windows服務上的完整步驟

    .net core部署到windows服務上的完整步驟

    前言 Net core 項目部門在Windows有很多種方式,大致有以下幾種, dotnet 命令, iis(windowshosts), 一些開源的應用容器(docker ) 基于一些exe 程
    2020-01-15
  • .NET Core 微信小程序退款步驟——(統一退款)

    .NET Core 微信小程序退款步驟——(統一退款)

    繼上一篇".NET Core 微信小程序支付——(統一下單)后",本文將實現統一退款功能,能支付就應該能退款嘛,一般涉及到錢的東西都會比較敏感,所以在設計退款流程時一
    2020-01-15
  • .NET core 3.0如何使用Jwt保護api詳解

    .NET core 3.0如何使用Jwt保護api詳解

    摘要: 本文演示如何向有效用戶提供jwt,以及如何在webapi中使用該token通過JwtBearerMiddleware中間件對用戶進行身份認證。 認證和授權區別? 首先我們要弄清楚認證
    2020-01-15
  • .Net Core下HTTP請求IHttpClientFactory示例詳解

    .Net Core下HTTP請求IHttpClientFactory示例詳解

    使用方式 IHttpClientFactory有四種模式: 基本用法 命名客戶端 類型化客戶端 生成的客戶端 基本用法 在 Startup.ConfigureServices 方法中,通過在
    2020-01-15
  • .net core webapi通過中間件獲取請求和響應內容的方法

    .net core webapi通過中間件獲取請求和響應內容的方法

    本文主要根據中間件來實現對.net core webapi中產生的請求和響應數據進行獲取并存入日志文件中; 這里不詳細介紹日志文件的使用。你可以自己接入NLog,log4net,Exce
    2020-01-15

最新評論

老快3投注技巧 上海体彩网11选五开奖结果 河南22选5基本走势图 河北快3一定牛预测三d试机号 河南快三和值走势图一定牛 快乐十分开奖视频 山东快乐扑克3豹子遗漏 股票融资买入是好是坏 山东体彩11选五开奖结果 2019今晚香港开码结果 明天股市走势分析 河南快三基本走势图一 牛盛配资 黑龙江11选5开奖结果 做福利彩票一年利润 浙江体彩20选5尾数走势 20选8快乐十分走势图