文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-03 09:07

关注
这篇文章主要给大家介绍了关于利用.net core实现反向代理中间件的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

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

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

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

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

Rest请求直接发往.net core程序

如果该请求在.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);

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

总结

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯