.NET Core如何進(jìn)行請求轉(zhuǎn)發(fā)的實現(xiàn)
前言
冒個泡,近日,有關(guān)注我公眾號的小伙伴私信我,遇到一個問題搞了很久沒解決,此問題具有參考意義,這里跟大家分享下,希望對后續(xù)可能有需要的你能有所參考和幫助。
請求轉(zhuǎn)發(fā)問題
內(nèi)網(wǎng)環(huán)境跟外網(wǎng)隔離,現(xiàn)在外網(wǎng)的請求都需要一個專用服務(wù)器轉(zhuǎn)接到內(nèi)網(wǎng)處理,用app.UseRewriter轉(zhuǎn)接, 從外網(wǎng)服務(wù)器轉(zhuǎn)發(fā)到內(nèi)網(wǎng)服務(wù)器的時候Header 里面的Authorization 居然丟失了,重新設(shè)置RewriteContext.HttpContex Header也不行,有沒有辦法解決?當(dāng)時我的想法是,實在不行,在外網(wǎng)將token直接放到url或body里不就完事,這樣的話,外網(wǎng)每增加一個接口,都得將token取出然后進(jìn)行轉(zhuǎn)換,內(nèi)網(wǎng)以相同方式獲取,這是小伙伴所不能忍受。這里我們創(chuàng)建兩個Web應(yīng)用程序,然后添加自定義轉(zhuǎn)發(fā)規(guī)則。首先我們在第一個Web應(yīng)用程序創(chuà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請求)或Body(POST請求)中包含其他參數(shù),將其對應(yīng)轉(zhuǎn)發(fā)寫入URL或Body即可,這里token已存儲在請求頭中,所以我們直接轉(zhuǎn)發(fā)請求即可。接下來我們通過Postman模擬外網(wǎng)發(fā)出如下POST請求
緊接著,我們在第二個Web應(yīng)用程序中來接收轉(zhuǎn)發(fā)請求,并獲取token信息
[HttpPost] public IActionResult Custom() { var token = Request.Headers[HeaderNames.Authorization].ToString(); return Ok(token); }
然后我們一運行,發(fā)現(xiàn)結(jié)果都沒轉(zhuǎn)發(fā)到對應(yīng)內(nèi)網(wǎng)應(yīng)用程序,這是為何呢?事實上,轉(zhuǎn)發(fā)請求涉及到資源重分配指向另一URL問題,當(dāng)然我們需要注意的是,既然是轉(zhuǎn)發(fā)請求,勢必轉(zhuǎn)發(fā)者和接受者請求方式必須一致,要不然肯定不行。所以我們必須顯式指定重定向狀態(tài)碼,設(shè)置為308,如下:
針對狀態(tài)碼308的意思,我們可以參看.NET Core中對于狀態(tài)碼枚舉解釋: 永久重定向,原始請求方式和目標(biāo)請求方式必須一致,支持原始請求和目標(biāo)請求同為GET或POST。 .NET Core中關(guān)于此狀態(tài)碼的解釋并不那么詳細(xì),我們來到專對狀態(tài)碼官方解釋( https://httpstatuses.com/308 ),這里我貼下谷歌翻譯后的中文:308永久重定向:已為目標(biāo)資源分配了一個新的永久URI,以后對該資源的任何引用都應(yīng)使用其中一個URI。具有鏈接編輯功能的客戶端應(yīng)在可能的情況下自動將對有效請求URI 1的引用重新鏈接到服務(wù)器發(fā)送的一個或多個新引用。服務(wù)器應(yīng)在響應(yīng)中生成一個Location頭字段,其中包含新的永久URI的首選URI引用。用戶代理可以使用位置字段值進(jìn)行自動重定向。服務(wù)器的響應(yīng)有效負(fù)載通常包含簡短的超文本注釋,其中包含指向新URI的超鏈接。默認(rèn)情況下,308響應(yīng)可緩存;即,除非方法定義或顯式緩存控制。
當(dāng)然,我們也可以設(shè)置狀態(tài)碼為301,301永久移動:已為目標(biāo)資源分配了一個新的永久URI,以后對該資源的任何引用都應(yīng)使用其中一個URI。那么狀態(tài)碼301和308到底有何區(qū)別呢? 301類似308永久移動,只不過,301不允許將請求方法從GET更改為POST。
總結(jié)
- 請求轉(zhuǎn)發(fā)時注意設(shè)置狀態(tài)碼為301或308
- 301類似308永久移動,只不過,301不允許將請求方法從GET更改為POST
- 基于以上所述,請求轉(zhuǎn)發(fā)推薦使用狀態(tài)碼308
到此這篇關(guān)于.NET Core如何進(jìn)行請求轉(zhuǎn)發(fā)的實現(xiàn)的文章就介紹到這了,更多相關(guān).NET Core 請求轉(zhuǎn)發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net在事件中啟動線程來打開一個頁面的實現(xiàn)方法
點擊一個按鈕做兩件事情,一件需要點擊按鈕馬上完成,另一件事情是點擊按鈕后做其他事情,不會的朋友一起來看看下面是如何實現(xiàn)的2014-11-11ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程
這篇文章主要介紹了ASP.NET Core 7 Razor Pages項目發(fā)布到IIS的詳細(xì)過程,詳細(xì)介紹了發(fā)布過程遇到的問題及解決方法,對ASP.NET Core 發(fā)布到IIS相關(guān)知識感興趣的朋友一起看看吧2023-01-01asp.net基于session實現(xiàn)購物車的方法
這篇文章主要介紹了asp.net基于session實現(xiàn)購物車的方法,結(jié)合實例形式較為詳細(xì)的分析了asp.net使用session存儲臨時數(shù)據(jù)實現(xiàn)購物車功能的相關(guān)技巧,需要的朋友可以參考下2015-11-11ABP引入SqlSugar框架的簡單版創(chuàng)建使用
這篇文章主要為大家介紹了ABP引入SqlSugar框架的簡單版創(chuàng)建使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04.NET 6開發(fā)TodoList應(yīng)用之實現(xiàn)ActionFilter
Filter在.NET Web API項目開發(fā)中也是很重要的一個概念,它運行在執(zhí)行MVC響應(yīng)的Pipeline中執(zhí)行,允許我們將一些可以在多個Action之間重用的邏輯抽取出來集中管理。本文將詳細(xì)介紹一下.NET 6如何實現(xiàn)ActionFilter,感興趣的可以學(xué)習(xí)一下2021-12-12DataGridView中CheckBox實現(xiàn)某一列單選
DataGridView中CheckBox實現(xiàn)某一列單選,需要的朋友可以參考一下2013-02-02linq to sql中,如何解決多條件查詢問題,答案,用表達(dá)式樹!
有個小項目中,用到了linq to sql,既然這樣,想必需要做多條件組合查詢了,雖然我對表達(dá)式樹的研究也只是寥寥地,但除此方法,似乎別無他法,只好硬著頭皮研究一下.2011-08-08