利用.net core實(shí)現(xiàn)反向代理中間件的方法
最近在將一些項(xiàng)目的rest api遷移到.net core中,最開始是用的Nginx做反向代理,將已經(jīng)完成切換的部分切入系統(tǒng),如下圖所示:

由于遷移過程中也在進(jìn)行代碼重構(gòu),需要經(jīng)常比較頻繁的測試,以保證能及時(shí)發(fā)現(xiàn)引入的問題。從而導(dǎo)致我們每遷移一部分都需要配置一次nginx的路由映射,保證遷移的功能能切入系統(tǒng)測試。
進(jìn)行了一段時(shí)間后,發(fā)現(xiàn)經(jīng)常配置Nginx一來比較麻煩,二來容易配錯(cuò);便想將這個(gè)反向代理的功能放在.net core程序中去,實(shí)現(xiàn)如下的功能:
- Rest請求直接發(fā)往.net core程序
- 如果該請求在.net core程序中實(shí)現(xiàn),則執(zhí)行請求并返回
- 如果未實(shí)現(xiàn),將其請求老版接口的數(shù)據(jù),并返回結(jié)果。
形成如下的一個(gè)結(jié)構(gòu):

試了一下,在.net core中實(shí)現(xiàn)這個(gè)功能比較簡單,加一個(gè)反向代理的中間件即可:
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函數(shù)的最后面,直接使用Run來反向代理所有未被系統(tǒng)實(shí)現(xiàn)的請求即可。
app.Run(Middleware.ReverseProxy.Invoke);
這里我這只是一個(gè)比較簡單的實(shí)現(xiàn),大概就二三十行代碼,也不是很完善,但試了一下,基本要的功能也都有,感興趣的朋友可以將其完善下,這個(gè)功能本身也只是一個(gè)過渡期使用的功能,后續(xù)使用過程中如果有更新也會放上來。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。
- ASP.NET Core 應(yīng)用程序中的靜態(tài)文件中間件的實(shí)現(xiàn)
- .Net Core中間件之靜態(tài)文件(StaticFiles)示例詳解
- .net core異常中間件的使用
- ASP.NET Core中間件初始化的實(shí)現(xiàn)
- 詳解ASP.NET Core 中基于工廠的中間件激活的實(shí)現(xiàn)方法
- 在 asp.net core 的中間件中返回具體的頁面的實(shí)現(xiàn)方法
- ASP.NET Core自定義中間件如何讀取Request.Body與Response.Body的內(nèi)容詳解
- .net core webapi通過中間件獲取請求和響應(yīng)內(nèi)容的方法
- 如何給asp.net core寫個(gè)中間件記錄接口耗時(shí)
- ASP.NET Core中間件計(jì)算Http請求時(shí)間示例詳解
- ASP.NET Core應(yīng)用錯(cuò)誤處理之ExceptionHandlerMiddleware中間件呈現(xiàn)“定制化錯(cuò)誤頁面”
- .net core靜態(tài)中間件的使用
相關(guān)文章
基于.net4.0實(shí)現(xiàn)IdentityServer4客戶端JWT解密
這篇文章主要為大家詳細(xì)介紹了基于.net4.0實(shí)現(xiàn)IdentityServer4客戶端JWT解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09
詳解ASP.NET MVC 解析模板生成靜態(tài)頁(RazorEngine)
我們在很多項(xiàng)目開發(fā)中會常常用到頁面靜態(tài)化,本篇文章主要介紹了詳解ASP.NET MVC 解析模板生成靜態(tài)頁(RazorEngine) ,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-03-03
詳解在ASP.NET Core下使用SignalR技術(shù)
本篇文章主要介紹了在ASP.NET Core下使用SignalR技術(shù) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
.NET單元測試使用AutoFixture按需填充的幾種方式和最佳實(shí)踐記錄
AutoFixture是一個(gè).NET庫,旨在簡化單元測試中的數(shù)據(jù)設(shè)置過程,通過自動生成測試數(shù)據(jù),它幫助開發(fā)者減少測試代碼的編寫量,使得單元測試更加簡潔、易讀和易維護(hù),本文介紹.NET單元測試使用AutoFixture按需填充的幾種方式和最佳實(shí)踐記錄,感興趣的朋友一起看看吧2024-07-07
ASP.NET實(shí)現(xiàn)用圖片進(jìn)度條顯示投票結(jié)果
ASP.NET實(shí)現(xiàn)用圖片進(jìn)度條顯示投票結(jié)果...2007-06-06

