.NET Core如何進行請求轉發?

前言

冒個泡,近日,有關注我公衆號的小夥伴私信我,遇到一個問題搞了很久沒解決,此問題具有參考意義,這裏跟大家分享下,希望對後續可能有需要的你能有所參考和幫助。

請求轉發問題

內網環境跟外網隔離,現在外網的請求都需要一個專用服務器轉接到內網處理,用app.UseRewriter轉接, 從外網服務器轉發到內網服務器的時候Header 裏面的Authorization 居然丟失了,重新設置RewriteContext.HttpContex Header也不行,有沒有辦法解決?當時我的想法是,實在不行,在外網將token直接放到url或body裏不就完事,這樣的話,外網每增加一個接口,都得將token取出然後進行轉換,內網以相同方式獲取,這是小夥伴所不能忍受。這裏我們創建兩個Web應用程序,然後添加自定義轉發規則。首先我們在第一個Web應用程序創建針對如下接口請求轉發規則

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中注入我們自定義轉發規則

app.UseRewriter(new RewriteOptions().Add(RewriteForwardRules.RedirectRequests));

當然,如果URL(GET請求)或Body(POST請求)中包含其他參數,將其對應轉發寫入URL或Body即可,這裏token已存儲在請求頭中,所以我們直接轉發請求即可。接下來我們通過Postman模擬外網發出如下POST請求

緊接着,我們在第二個Web應用程序中來接收轉發請求,並獲取token信息

[HttpPost]
public IActionResult Custom()
{
    var token = Request.Headers[HeaderNames.Authorization].ToString();

    return Ok(token);
}

然後我們一運行,發現結果都沒轉發到對應內網應用程序,這是爲何呢?事實上,轉發請求涉及到資源重分配指向另一URL問題,當然我們需要注意的是,既然是轉發請求,勢必轉發者和接受者請求方式必須一致,要不然肯定不行。所以我們必須顯式指定重定向狀態碼,設置爲308,如下:

 

針對狀態碼308的意思,我們可以參看.NET Core中對於狀態碼枚舉解釋:永久重定向,原始請求方式和目標請求方式必須一致,支持原始請求和目標請求同爲GET或POST。.NET Core中關於此狀態碼的解釋並不那麼詳細,我們來到專對狀態碼官方解釋(https://httpstatuses.com/308),這裏我貼下谷歌翻譯後的中文:308永久重定向:已爲目標資源分配了一個新的永久URI,以後對該資源的任何引用都應使用其中一個URI。具有鏈接編輯功能的客戶端應在可能的情況下自動將對有效請求URI 1的引用重新鏈接到服務器發送的一個或多個新引用。服務器應在響應中生成一個Location頭字段,其中包含新的永久URI的首選URI引用。用戶代理可以使用位置字段值進行自動重定向。服務器的響應有效負載通常包含簡短的超文本註釋,其中包含指向新URI的超鏈接。默認情況下,308響應可緩存;即,除非方法定義或顯式緩存控制。

 

當然,我們也可以設置狀態碼爲301,301永久移動:已爲目標資源分配了一個新的永久URI,以後對該資源的任何引用都應使用其中一個URI。那麼狀態碼301和308到底有何區別呢?301類似308永久移動,只不過,301不允許將請求方法從GET更改爲POST。

總結

💡 請求轉發時注意設置狀態碼爲301或308

💡 301類似308永久移動,只不過,301不允許將請求方法從GET更改爲POST

💡 基於以上所述,請求轉發推薦使用狀態碼308

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章