.NET Core如何進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)的實(shí)現(xiàn)
前言
冒個(gè)泡,近日,有關(guān)注我公眾號(hào)的小伙伴私信我,遇到一個(gè)問(wèn)題搞了很久沒(méi)解決,此問(wèn)題具有參考意義,這里跟大家分享下,希望對(duì)后續(xù)可能有需要的你能有所參考和幫助。
請(qǐng)求轉(zhuǎn)發(fā)問(wèn)題
內(nèi)網(wǎng)環(huán)境跟外網(wǎng)隔離,現(xiàn)在外網(wǎng)的請(qǐng)求都需要一個(gè)專用服務(wù)器轉(zhuǎn)接到內(nèi)網(wǎng)處理,用app.UseRewriter轉(zhuǎn)接, 從外網(wǎng)服務(wù)器轉(zhuǎn)發(fā)到內(nèi)網(wǎng)服務(wù)器的時(shí)候Header 里面的Authorization 居然丟失了,重新設(shè)置RewriteContext.HttpContex Header也不行,有沒(méi)有辦法解決?當(dāng)時(shí)我的想法是,實(shí)在不行,在外網(wǎng)將token直接放到url或body里不就完事,這樣的話,外網(wǎng)每增加一個(gè)接口,都得將token取出然后進(jìn)行轉(zhuǎn)換,內(nèi)網(wǎng)以相同方式獲取,這是小伙伴所不能忍受。這里我們創(chuàng)建兩個(gè)Web應(yīng)用程序,然后添加自定義轉(zhuǎn)發(fā)規(guī)則。首先我們?cè)诘谝粋€(gè)Web應(yīng)用程序創(chuàng)建針對(duì)如下接口請(qǐng)求轉(zhuǎn)發(fā)規(guī)則
public class RewriteForwardRules
{
public static void RedirectRequests(RewriteContext context)
{
var request = context.HttpContext.Request;
if (request.Path.Value.StartsWith("/api/forward", StringComparison.OrdinalIgnoreCase))
{
var response = context.HttpContext.Response;
response.Headers[HeaderNames.Location] = "http://localhost:8091/api/custom";
context.Result = RuleResult.EndResponse;
}
}
}
然后在startup中注入我們自定義轉(zhuǎn)發(fā)規(guī)則
app.UseRewriter(new RewriteOptions().Add(RewriteForwardRules.RedirectRequests));
當(dāng)然,如果URL(GET請(qǐng)求)或Body(POST請(qǐng)求)中包含其他參數(shù),將其對(duì)應(yīng)轉(zhuǎn)發(fā)寫(xiě)入U(xiǎn)RL或Body即可,這里token已存儲(chǔ)在請(qǐng)求頭中,所以我們直接轉(zhuǎn)發(fā)請(qǐng)求即可。接下來(lái)我們通過(guò)Postman模擬外網(wǎng)發(fā)出如下POST請(qǐng)求

緊接著,我們?cè)诘诙€(gè)Web應(yīng)用程序中來(lái)接收轉(zhuǎn)發(fā)請(qǐng)求,并獲取token信息
[HttpPost]
public IActionResult Custom()
{
var token = Request.Headers[HeaderNames.Authorization].ToString();
return Ok(token);
}
然后我們一運(yùn)行,發(fā)現(xiàn)結(jié)果都沒(méi)轉(zhuǎn)發(fā)到對(duì)應(yīng)內(nèi)網(wǎng)應(yīng)用程序,這是為何呢?事實(shí)上,轉(zhuǎn)發(fā)請(qǐng)求涉及到資源重分配指向另一URL問(wèn)題,當(dāng)然我們需要注意的是,既然是轉(zhuǎn)發(fā)請(qǐng)求,勢(shì)必轉(zhuǎn)發(fā)者和接受者請(qǐng)求方式必須一致,要不然肯定不行。所以我們必須顯式指定重定向狀態(tài)碼,設(shè)置為308,如下:


針對(duì)狀態(tài)碼308的意思,我們可以參看.NET Core中對(duì)于狀態(tài)碼枚舉解釋: 永久重定向,原始請(qǐng)求方式和目標(biāo)請(qǐng)求方式必須一致,支持原始請(qǐng)求和目標(biāo)請(qǐng)求同為GET或POST。 .NET Core中關(guān)于此狀態(tài)碼的解釋并不那么詳細(xì),我們來(lái)到專對(duì)狀態(tài)碼官方解釋( https://httpstatuses.com/308 ),這里我貼下谷歌翻譯后的中文:308永久重定向:已為目標(biāo)資源分配了一個(gè)新的永久URI,以后對(duì)該資源的任何引用都應(yīng)使用其中一個(gè)URI。具有鏈接編輯功能的客戶端應(yīng)在可能的情況下自動(dòng)將對(duì)有效請(qǐng)求URI 1的引用重新鏈接到服務(wù)器發(fā)送的一個(gè)或多個(gè)新引用。服務(wù)器應(yīng)在響應(yīng)中生成一個(gè)Location頭字段,其中包含新的永久URI的首選URI引用。用戶代理可以使用位置字段值進(jìn)行自動(dòng)重定向。服務(wù)器的響應(yīng)有效負(fù)載通常包含簡(jiǎn)短的超文本注釋,其中包含指向新URI的超鏈接。默認(rèn)情況下,308響應(yīng)可緩存;即,除非方法定義或顯式緩存控制。
當(dāng)然,我們也可以設(shè)置狀態(tài)碼為301,301永久移動(dòng):已為目標(biāo)資源分配了一個(gè)新的永久URI,以后對(duì)該資源的任何引用都應(yīng)使用其中一個(gè)URI。那么狀態(tài)碼301和308到底有何區(qū)別呢? 301類似308永久移動(dòng),只不過(guò),301不允許將請(qǐng)求方法從GET更改為POST。
總結(jié)
- 請(qǐng)求轉(zhuǎn)發(fā)時(shí)注意設(shè)置狀態(tài)碼為301或308
- 301類似308永久移動(dòng),只不過(guò),301不允許將請(qǐng)求方法從GET更改為POST
- 基于以上所述,請(qǐng)求轉(zhuǎn)發(fā)推薦使用狀態(tài)碼308
到此這篇關(guān)于.NET Core如何進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān).NET Core 請(qǐng)求轉(zhuǎn)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)HTTP協(xié)議迷你服務(wù)器(兩種方法)
用C#語(yǔ)言實(shí)現(xiàn)HTTP協(xié)議的服務(wù)器類本文將以兩種稍微有差別的方式用C#語(yǔ)言實(shí)現(xiàn);要完成高性能的Web服務(wù)功能,通常都是需要寫(xiě)入到服務(wù),如IIS,Apache Tomcat感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)c#有所幫助2013-02-02
asp.net forms身份驗(yàn)證,避免重復(fù)造輪子
最近開(kāi)始一個(gè)小 asp.net 項(xiàng)目,整個(gè)項(xiàng)目需要登錄才能操作。以前大家都采用 asp 的方式 session + cookie 來(lái)實(shí)現(xiàn)身份驗(yàn)證,我一直對(duì) asp.net 自帶的 forms 驗(yàn)證早就耳聞,苦于沒(méi)實(shí)踐,今天剛好逮到機(jī)會(huì)實(shí)際應(yīng)用一下。2009-11-11
ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之用戶添加和瀏覽2(七)
這篇文章主要為大家詳細(xì)介紹了ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)之用戶添加和瀏覽,感興趣的小伙伴們可以參考一下2016-08-08
asp.net 動(dòng)態(tài)生成控件并獲取其值
代碼比較簡(jiǎn)單,所以不多做解釋了:2009-02-02
基于asp.net MVC 應(yīng)用程序的生命周期(詳解)
下面小編就為大家分享一篇基于asp.net MVC 應(yīng)用程序的生命周期詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
asp.net使用ashx生成圖形驗(yàn)證碼的方法示例
這篇文章主要介紹了asp.net使用ashx生成圖形驗(yàn)證碼的方法,結(jié)合實(shí)例形式分析了asp.net生成圖形驗(yàn)證碼的步驟、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-07-07

