ASP.NET Core 中的重定向

前言

在《如何使用ASP.NET Core Web API實現短鏈接服務》中,我們使用了Redirect方法返回跳轉狀態碼:

[HttpGet("{shortUrl}")]
public?IActionResult?GetUrl(string?shortUrl)
{var?hashids?=?new?Hashids("公眾號My?IO",?minHashLength:?6);var?id?=?hashids.Decode(shortUrl)[0];var?urlData?=?db.Get(id);return?Redirect(urlData.Url);
}

Redirect方法會生成RedirectResult類實例,而RedirectResult構造函數可以傳入 2 個 bool 值:

public?RedirectResult(string?url,?bool?permanent,?bool?preserveMethod)

那么,為它們賦不同值,對跳轉狀態碼有什么影響呢?

探究

查找這 2 個參數的引用,我們最終定位到RedirectResultExecutor.cs[1]:

if?(result.PreserveMethod)
{context.HttpContext.Response.StatusCode?=?result.Permanent??StatusCodes.Status308PermanentRedirect?:?StatusCodes.Status307TemporaryRedirect;context.HttpContext.Response.Headers.Location?=?destinationUrl;
}
else
{context.HttpContext.Response.Redirect(destinationUrl,?result.Permanent);
}

PreserveMethod = true

使用 Location 標頭返回需要跳轉的 Url。

Permanent 決定狀態碼:

Permanent狀態碼說明
false307臨時重定向響應狀態碼,表示請求的資源暫時地被移動到了響應的 Location 所指向的 URL 上。
true308永久重定向響應狀態碼,說明請求的資源已經被永久的移動到了由 Location 指定的 URL 上

PreserveMethod = false

執行Response.Redirect方法進行跳轉,內部實現如下:

public?override?void?Redirect(string?location,?bool?permanent)
{if?(permanent){HttpResponseFeature.StatusCode?=?301;}else{HttpResponseFeature.StatusCode?=?302;}Headers.Location?=?location;
}

其實和PreserveMethod = true的邏輯是一樣的,只是返回的狀態碼不同:

Permanent狀態碼說明
false302表明請求的資源被暫時的移動到了由該HTTP響應的響應頭Location 指定的 URL 上。
true301表明請求的資源已經被移動到了由 Location 頭部指定的url上,是固定的不會再改變

綜上,ASP.NET Core 中的重定向一共包含 4 種:

狀態碼PreserveMethodPermanent生成RedirectResult方法
301falsetrueRedirectPermanent()
302falsefalseRedirect()
307truefalseRedirectPreserveMethod()
308truetrueRedirectPermanentPreserveMethod()

Demo

那它們之間具體有什么差別呢?

編寫如下代碼:

[HttpGet("RedirectPermanent")]
[HttpPost("RedirectPermanent")]
public?IActionResult?RedirectPermanent()
{_logger.LogInformation("RedirectPermanent");return?RedirectPermanent("MyIO");
}[HttpGet("Redirect")]
[HttpPost("Redirect")]
public?IActionResult?Redirect()
{_logger.LogInformation("Redirect");return?Redirect("MyIO");
}[HttpGet("RedirectPreserveMethod")]
[HttpPost("RedirectPreserveMethod")]
public?IActionResult?RedirectPreserveMethod()
{_logger.LogInformation("RedirectPreserveMethod");return?RedirectPreserveMethod("MyIO");
}[HttpGet("RedirectPermanentPreserveMethod")]
[HttpPost("RedirectPermanentPreserveMethod")]
public?IActionResult?RedirectPermanentPreserveMethod()
{_logger.LogInformation("RedirectPermanentPreserveMethod");return?RedirectPermanentPreserveMethod("MyIO");
}[HttpGet("MyIO")]
[HttpPost("MyIO")]
public?string?MyIO()
{return?this.Request.Method;
}
  • 所有方法都同時支持GETPOST方法

  • 所有方法都會重定向到同一個方法,顯示當前請求方法

每個 API 都請求 2 遍,可以看到:

  • Permanent = true 的Get請求只會執行一次,后續會直接請求跳轉后的地址

    d94dc3a201916833e26f827dcc6a126b.png

  • PreserveMethod = false 的POST請求,跳轉后實際執行的Get請求

    50976f5f06ba3a3f3e792ab61c1cbdba.png

結論

如果想只發生一次重定向,則應考慮使用RedirectPermanent或者RedirectPermanentPreserveMethod

如果要為非 GET 請求使用重定向,則應考慮使用RedirectPreserveMethod或者RedirectPermanentPreserveMethod

添加微信號【MyIO666】,邀你加入技術交流群

參考資料

[1]

RedirectResultExecutor.cs: https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.Core/src/Infrastructure/RedirectResultExecutor.cs#L63

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283834.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283834.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283834.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#IO

System.IO 命名空間包含允許讀寫文件和數據流的類型以及提供基本文件和目錄支持的類型。string url "C:\chisp.log";if (System.IO.File.Exists(url)){Response.Write("文件存在");}else{ Response.Write("文件不存在"); }System.IO.File.Exist…

Lind.DDD.Manager里的3,7,15,31,63,127,255,511,1023,2047

回到目錄 進制 我是一個程序猿,我喜歡簡單的數字,十進制如何,數字太多,有10種數字組成,但由于它廣為人知,所有使用最為廣泛,人們的慣性思維培養了十進制,并說它是最容易被計算的數字…

3.20學習內容,字符串與列表

一、字符串類型: 作用:名字,性別,國籍,地址等描述信息 定義:在單引號\雙引號\三引號內,由一串字符組成。 需要掌握的方法: 1、strip 去除指定字符lstrip 去除左邊指定字符rstri…

客戶端應用試用限制設計

1.概要最近接到公司安排的任務給客戶端設計一個“試用30天”的一個需求,其功能主要是為了防止客戶拿到產品之后不支付尾款繼續使用。眾所周知靠純軟件想防“盜版”,“限制試用”等做法是行業難題。只要價值足夠高一定有人會破解繞過你的所有防線達到免費…

【開發工具之Spring Tool Suite】6、用Spring Tool Suite簡化你的開發

如果你是一個喜歡用spring的人,你可能會在欣賞spring的強大功能外,對其各樣的配置比較郁悶,尤其是相差較大的版本在配置文件方面會存在差異,當然你可以去花不少的時間去網上查找相關的資料,當你準備使用更高版本spring…

康威定律,作為架構師還不會靈活運用?

Soft skills are always hard than hard skills. 軟技能比硬技能難。 老板聽說最近流行“微服務”,問架構師咱們的系統要不要來一套?老板又聽說最近流行“中臺系統”,問架構師咱們要不要搞起來?其實,這些問題不用老板問…

使用onclick跳轉到其他頁面。使用button跳轉到指定url

1. οnclick"javascript:window.location.hrefaa.htm" 2. οnclick"locationURL"3,。 οnclick"window.location.href?id11"轉載于:https://www.cnblogs.com/wujixing/p/5856087.html

Avalonia Beta 1對WPF做了很多改進

\看新聞很累?看技術新聞更累?試試下載InfoQ手機客戶端,每天上下班路上聽新聞,有趣還有料!\\\Avalonia將自己定義為“基于WPF(使用XAML、數據綁定以及lookless控件等)的跨平臺.NET UI框架。”在第…

WebView2 通過 PuppeteerSharp 實現RPA獲取壁紙 (案例版)

此案例是《.Net WebView2 項目,實現 嵌入 WEB 頁面 Chromium內核》文的續集。主要是針對WebView2的一些微軟自己封裝的不熟悉的API,有一些人已經對 PuppeteerSharp很熟悉了,那么,直接用 PuppeteerSharp的話,那就降低了…

[轉]2022 年 Java 行業分析報告

你好,我是看山。 前段時間介紹了從 Java8 到 Java17 每個版本比較有特點的新特性(收錄在 從小工到專家的 Java 進階之旅 專欄),今天看到 JRebel 發布了《2022 年 Java 發展趨勢和分析》,于是借此分析一下 Java 行業的現…

Mysql 數據庫學習筆記03 存儲過程

一、存儲過程:如下 通過 out 、inout 將結果輸出,可以輸出多個值。 * 調用存儲過程: call 存儲名稱(參數1,參數2,...); 如指定參數不符合要求,返回 Empty Set * 查詢存儲過…

android 代碼混淆模板

#指定代碼的壓縮級別 -optimizationpasses 5 #包明不混合大小寫 -dontusemixedcaseclassnames #不去忽略非公共的庫類 -dontskipnonpubliclibraryclasses#優化 不優化輸入的類文件 -dontoptimize#預校驗 -dontpreverify#混淆時是否記錄日志 -verbose# 混淆時所采用的算法 -opt…

vue+vuecli+webapck2實現多頁面應用

準備工作 在本地用vue-cli新建一個項目,首先安裝vue-cil,命令: npm install -g vue-cli 新建一個vue項目,創建一個基于"webpack"的項目,項目名為vuedemo: vue init webpack vuedemo 這里有一個地方需要改一下&#xff0…

一文把Docker、Kubernetes搞懂:什么是Docker?什么是Kubernetes?Docker和Kubernetes有什么關系和區別?通俗解釋Docker、Kubernetes

一、Docker解決的問題 1、統一標準 ● 應用構建 ○ Java、C、JavaScript——編程各異 ○ 打成軟件包 ○ .exe(類似Windows,最終也只是生產exe執行) ○ 使用docker build … 打包成 鏡像——這就類似于exe ● 應用分享 ○ 所有軟件的鏡像放到一…

Python-高階函數

#encodingUTF-8import sys # 高階函數高階函數實際上是參數可接受函數的函數即參數為函數的函數 # map()map()接收兩個參數,一個是函數,一個是序列,將此函數分別作用于該序列的每個元素,返回處理后的序列結果def c2(x): return x…

程序員雙手飛快敲鍵盤的時候是在敲代碼嗎?

當你看到一個程序員的兩只手在鍵盤上上下翻飛,行云流水的時候,多半不是在敲擊代碼大概率是在跟產品經理撕逼討論需求另一種可能就是在跟測試打口水仗10%幾率是在論壇碼字摸魚或者和人家開噴了。1%幾率是在跟MM聊天可以手速飛快而不需要停下思考的代碼&am…

erlang-17版本的編碼方式

最近在騰訊云租了個云主機:鏡像提供方:選擇服務市場 :多語言環境(Centos 7.0 64位 Python Perl Ruby Erlang ) 他們集成軟件安裝的是erlang-17版本,我之前用erlang-16版本一直沒遇到什么問題; 這…

幾分鐘上線一個網站 真是神器

1、ToolJet 簡介 ToolJet 是一個開源的低代碼框架,可以快速構建和部署內部工具,而無需工程團隊付出太多努力。您可以連接到您的數據源,例如數據庫(如 PostgreSQL、MongoDB、Elasticsearch 等)、API 端點(To…

翻譯:用戶變量(User-Defined Variable)(已提交到MariaDB官方手冊)

本文為mariadb官方手冊:User-Defined Variables的譯文。 原文:https://mariadb.com/kb/en/user-defined-variables/我提交到MariaDB官方手冊的譯文:https://mariadb.com/kb/zh-cn/user-defined-variables/ 用戶變量是指由用戶創建&#xff0…

移植Python3到TQ2440(一)

平臺 硬件:TQ2440 64MB內存 256MB NandFlashbootloader:U-Boot 2015.04kernel:linux-4.9Python: Python-3.6.0工具鏈:arm-none-linux-gnueabi-gcc 4.8.3概述 現在樹莓派很火,在樹莓派上面用戶可以通過Python來控制板…