国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ASP.NET Core 6框架揭秘實例演示[37]:重定向的N種實現方式

這篇具有很好參考價值的文章主要介紹了ASP.NET Core 6框架揭秘實例演示[37]:重定向的N種實現方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在HTTP的語義中,重定向一般指的是服務端通過返回一個狀態(tài)碼為3XX的響應促使客戶端像另一個地址再次發(fā)起請求,本章將此稱為“客戶端重定向“。既然有客戶端重定向,自然就有服務端重定向,本章所謂的服務端重定向指的是在服務端通過改變請求路徑將請求導向另一個終結點。ASP.NET下的重定向是通過RewriteMiddleware中間件實現的。(本文提供的示例演示已經同步到《ASP.NET Core 6框架揭秘-實例演示版》)

[S2501]客戶端重定向 (源代碼)
[S2502]服務端重定向 (源代碼)
[S2503]采用IIS重寫規(guī)則實現重定向(源代碼)
[S2504]采用Apache重寫規(guī)則實現重定向(源代碼)
[S2505]基于HTTPS終結點的重定向(源代碼)

[S2501]客戶端重定向

我們可以為RewriteMiddleware中間件定義客戶端重定向規(guī)則使之返回一個Location報頭指向重定向地址的3XX響應??蛻舳耍ū热鐬g覽器)在接收到這樣的響應后會根據狀態(tài)碼約定的語義向重定向地址重新發(fā)起請求,我們將這種由客戶端對新的地址重新請求的方式稱為“客戶端重定向”。

下面演示的這個例子會將請求路徑以“foo/**”為前綴的請求重定向到新的路徑“/bar/**”。如代碼片段所示,我們通過調用UseRewriter擴展方法注冊了RewriteMiddleware中間件,該方法會將對應的RewriteOptions配置選項作為參數。我們直接調用構造函數創(chuàng)建的這個RewriteOptions對象,并調用其AddRedirect擴展方法添加了一個重定向規(guī)則,該方法定義了兩個參數,前者(“^/foo/(.*)”)代表參與重定向的原始路徑模式(正則表達式),后者(“baz/$1”)表示重定向目標地址模板,占位符“$1”表示在進行正則匹配時產生的首段捕獲內容(前綴“foo/”后面的部分)。請求的URL會作為響應的內容。

using Microsoft.AspNetCore.Rewrite;

var app = WebApplication.Create();
var options = new RewriteOptions().AddRedirect("^foo/(.*)", "bar/$1");
app.UseRewriter(options);
app.MapGet("/{**foobar}", (HttpRequest request) =>$"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}");
app.Run();

演示程序注冊了一個采用“/{**foobar}”路由模板的終結點,請求URL直接作為該終結點的響應內容。演示程序啟動之后,所有路徑以“/foo”為前綴的請求都會自動重定向到以“/bar”為前綴的地址。如果請求路徑被設置為“/foo/abc/123”,最終將會被重定向到圖1所示的“/bar/abc/123”路徑下。

ASP.NET Core 6框架揭秘實例演示[37]:重定向的N種實現方式

圖1 客戶端重定向

整個過程涉及HTTP報文交換更能體現客戶端重定向的本質。如下所示的是整個過程涉及的兩次報文交換,我們可以看出服務端第一次返回的是狀態(tài)碼為302的響應,根據映射規(guī)則生成的重定向地址體現在Location報頭上。

GET http://localhost:5000/foo/abc/123 HTTP/1.1
Host: localhost:5000

HTTP/1.1 302 Found
Content-Length: 0
Date: Wed, 22 Sep 2021 13:34:17 GMT
Server: Kestrel
Location: /bar/abc/123
GET http://localhost:5000/bar/abc/123 HTTP/1.1
Host: localhost:5000

HTTP/1.1 200 OK
Date: Wed, 22 Sep 2021 13:34:17 GMT
Server: Kestrel
Content-Length: 33

http://localhost:5000/bar/abc/123

[S2502]服務端重定向

服務端重定向會在服務端通過重寫請求路徑的方式將請求重定向到新的終結點。對于前面演示的程序來說,我們只需要對它做簡單的修改就能切換到服務端重定向。如下面的代碼片段所示,在RewriteOptions對象被創(chuàng)建后,我們調用它的另一個AddRewrite擴展方法注冊了一條服務端重定向(URL重寫)規(guī)則,原始請求路徑的正則表達式和重定向路徑均保持不變。

using Microsoft.AspNetCore.Rewrite;

var app = WebApplication.Create();
var options = new RewriteOptions().
    .AddRewrite(regex: "^foo/(.*)", replacement: "bar/$1", skipRemainingRules: true);
app.UseRewriter(options);
app.MapGet("/{**foobar}", (HttpRequest request) =>
    $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}");
app.Run();
改動的程序啟動后,如果利用瀏覽器采用相同的路徑(“/foo/abc/123”)對站點發(fā)起請求,我們會得到如圖2所示的相同的響應內容。由于這次采用的是服務端重定向,整個過程只會涉及一次報文交換,所以瀏覽器的請求地址不會改變。

ASP.NET Core 6框架揭秘實例演示[37]:重定向的N種實現方式

圖2 服務端重定向

[S2503]采用IIS重寫規(guī)則實現重定向

重定向是絕大部分Web服務器(比如IIS、Apache和Nginx等)都會提供的功能,但是不同的服務器類型針對重定向規(guī)則具有不同的定義方式。IIS中的重定向被稱為“URL重寫”,具體的URL重寫規(guī)則采用XML格式進行定義,RewriteMiddleware中間件對它提供了原生的支持。我們將URL重寫規(guī)則以如下的方式定義在創(chuàng)建的rewrite.xml文件中,并將該文件保存在演示項目的根目錄下。

<rewrite>
    <rules>
       <rule name="foo">
	    <match url="^foo/(.*)" />
	    <action type="Redirect" url="baz/{R:1}" />
	</rule>
	<rule name="bar">
	    <match url="^bar/(.*)" />
	    <action type="Rewrite" url="baz/{R:1}" />
	</rule>
    </rules>
</rewrite>

如上所示的XML文件定義了兩條指向目標地址“baz/{R:1}”的規(guī)則,這里的占位符“{R:1}”和前面定義的“$1”一樣,都表示針對初始請求路徑進行正則匹配時得到的第一段捕獲內容。兩條規(guī)則用來匹配原始路徑的正則表達式分別定義為“^foo/(.*)”和“^bar/(.*)”。它們采用的Action類型也不相同,前者為“Redirect”,表示客戶端重定向;后者為“Rewrite”,表示服務端重定向。

為了將采用XML文件定義的IIS重定向規(guī)則應用到演示程序中,我們對演示程序如下的修改。如代碼片段所示,在RewriteOptions對象被創(chuàng)建出來后,我們調用了它的AddIISUrlRewrite擴展方法添加了IIS URL重寫規(guī)則,該方法的兩個參數分別表示用來讀取規(guī)則文件的IFileProvider對象和規(guī)則文件針對該對象的路徑。由于規(guī)則文件存儲與項目根目錄下,這也是ASP.NET應用“內容根目錄”所在的位置,所以我們可以使用內容根目錄對應的IFileProvider對象。

using Microsoft.AspNetCore.Rewrite;

var app = WebApplication.Create();
var options = new RewriteOptions().AddIISUrlRewrite(fileProvider: app.Environment.ContentRootFileProvider, filePath: "rewrite.xml");
app.UseRewriter(options);
app.MapGet("/{**foobar}", (HttpRequest request) =>$"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}");
app.Run();

改動的程序啟動之后,我們針對添加的兩條重定向規(guī)則發(fā)送了對應的請求,它們采用的請求路徑分別為“/foo/abc/123”和“/bar/abc/123”。從圖3所示的輸出可以看出,這兩個請求均被重定向到相同的目標路徑“/baz/abc/123”。

ASP.NET Core 6框架揭秘實例演示[37]:重定向的N種實現方式

圖3 IIS重定向規(guī)則

由于發(fā)送的兩個請求分別采用客戶端和服務端重定向方式導向新的地址,所以瀏覽器針對前者顯示的是重定向后的地址,對于后者則顯示原始的地址。整個過程涉及到的如下三次報文交互更能說明兩種重定向方式的差異,從報文內容我們可以進一步看出第一次采用的是響應狀態(tài)碼為301的永久重定向。

GET http://localhost:5000/foo/abc/123 HTTP/1.1
Host: localhost:5000

HTTP/1.1 301 Moved Permanently
Content-Length: 0
Date: Wed, 22 Sep 2021 23:26:02 GMT
Server: Kestrel
Location: /baz/abc/123
GET http://localhost:5000/baz/abc/123 HTTP/1.1
Host: localhost:5000

HTTP/1.1 200 OK
Date: Wed, 22 Sep 2021 23:26:02 GMT
Server: Kestrel
Content-Length: 33

http://localhost:5000/baz/abc/123
GET http://localhost:5000/bar/abc/123 HTTP/1.1
Host: localhost:5000

HTTP/1.1 200 OK
Date: Wed, 22 Sep 2021 23:26:26 GMT
Server: Kestrel
Content-Length: 33

http://localhost:5000/baz/abc/123

[S2504]采用Apache重寫規(guī)則實現重定向

上面我們演示了RewriteMiddleware中間件針對IIS重定向規(guī)則的支持,實際上該中間件還支持Apache的重定向模塊mod_rewriter所采用的重定向規(guī)則定義形式,我們照例來做一個簡單的演示。我們在項目根目錄下添加了一個名為rewrite.config的配置文件,并在其中定義了如下兩條重定向規(guī)則。

RewriteRule ^/foo/(.*) /baz/$1 [R=307]
RewriteRule ^/bar/(.*) - [F]

上面第一條規(guī)則利用R這個Flag將路徑與正則表達式“^/foo/(.*)”相匹配的請求以重定向到新的路徑“/baz/$1”,具體采用的是針對狀態(tài)碼307的臨時客戶端重定向。對于其路徑與正則表達式“^/bar/(.*)”相匹配的請求,我們將它視為未經授權授權的請求,所以對應的規(guī)則采用F(Forbidden)這個Flag。為了讓演示程序采用上述這個配置文件定義的Apache重定向規(guī)則,我們只需要按照如下的方式調用RewriteOptions 對象的AddApacheModRewrite擴展方法就可以了。

using Microsoft.AspNetCore.Rewrite;

var app = WebApplication.Create();
var options = new RewriteOptions().AddApacheModRewrite(fileProvider: app.Environment.ContentRootFileProvider, filePath: "rewrite.config");
app.UseRewriter(options);
app.MapGet("/{**foobar}", (HttpRequest request) =>$"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}");
app.Run();

改動的程序啟動之后,我們針對添加的兩條重定向規(guī)則發(fā)送了對應的請求,它們采用的請求路徑分別為“/foo/abc/123”和“/bar/abc/123”。從圖4所示的輸出可以看出,第一個請求均被重定向到相同的目標路徑“/baz/abc/123”,第二個請求返回一個狀態(tài)碼為403的響應。

ASP.NET Core 6框架揭秘實例演示[37]:重定向的N種實現方式

圖4Apache mod-_rewrite重定向規(guī)則

如下所示的是整個過程涉及到的三次報文交換。我們可以看出第一次請求得到的響應狀態(tài)碼正式我們在規(guī)則中顯式設置的307。第二個請求由于被視為權限不足,服務端直接返回一個狀態(tài)為“403 Forbidden”的響應。

GET http://localhost:5000/foo/abc/123 HTTP/1.1
Host: localhost:5000

HTTP/1.1 307 Temporary Redirect
Content-Length: 0
Date: Wed, 22 Sep 2021 23:56:26 GMT
Server: Kestrel
Location: /baz/abc/123
GET http://localhost:5000/baz/abc/123 HTTP/1.1
Host: localhost:5000

HTTP/1.1 200 OK
Date: Wed, 22 Sep 2021 23:56:26 GMT
Server: Kestrel
Content-Length: 33
GET http://localhost:5000/bar/abc/123 HTTP/1.1
Host: localhost:5000

HTTP/1.1 403 Forbidden
Content-Length: 0
Date: Wed, 22 Sep 2021 23:56:33 GMT
Server: Kestrel

[S2505]基于HTTPS終結點的重定向

將針對HTTP請求重定向到對應HTTPS終結點是一種常見的重定向場景。如下所示的演示針對路徑“/foo”和“/bar”注冊了兩個終結點,它們均由注冊的兩個中間件構建的RequestDelegate委托作為處理器,其中一個就是調用UseRewriter擴展方法注冊的RewriteMiddleware中間件,另一個中間件則是通過調用Run擴展方法注冊的,后者依然將最終請求的URL作為響應的內容。

using Microsoft.AspNetCore.Rewrite;

var app = WebApplication.Create();
app.MapGet("/foo", CreateHandler(app, 302));
app.MapGet("/bar", CreateHandler(app, 307));
app.Run();

static RequestDelegate CreateHandler(IEndpointRouteBuilder endpoints, int statusCode)
{
    var app = endpoints.CreateApplicationBuilder();
    app
        .UseRewriter(new RewriteOptions().AddRedirectToHttps(statusCode, 5001))
        .Run(httpContext => {
            var request = httpContext.Request;
            var address =
            $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}";
            return httpContext.Response.WriteAsync(address);
        });
    return app.Build();
}

兩個終結點的處理器通過本地方法CreateHandler創(chuàng)建出來的。該方法調用當前WebApplication對象的CreateApplicationBuilder方法創(chuàng)建了一個新的IApplicationBuilder對象,并調用后者的UseRewriter擴展方法注冊了RewriteMiddleware中間件。我們?yōu)樵撝虚g件提供的HTTPS重定向規(guī)則是通過調用RewriteOptions對象的AddRedirectToHttps擴展方法定義的,該方法時指定了重定向響應采用的狀態(tài)碼(302和307)和HTTPS終結點采用的端口號。改動的程序啟動之后,針對兩個終結點的HTTP請求(“http://localhost:5000/foo”和“http://localhost:5000/bar”)均以圖5所示的形式被重定向到了對應的HTTPS終結點。

ASP.NET Core 6框架揭秘實例演示[37]:重定向的N種實現方式

圖5 HTTPS重定向

整個過程涉及到如下四次報文交換,我們可以看出我們通過調用AddRedirectToHttps擴展方法定義的規(guī)則采用的是客戶端重定向。重定向響應采用了我們設置的狀態(tài)碼,分別是“302 Found”和“307 Temporary Redirect”。文章來源地址http://www.zghlxwxcb.cn/news/detail-480725.html

GET http://localhost:5000/foo HTTP/1.1
Host: localhost:5000

HTTP/1.1 302 Found
Content-Length: 0
Date: Thu, 23 Sep 2021 12:10:51 GMT
Server: Kestrel
Location: https://localhost:5001/foo
GET https://localhost:5001/foo HTTP/1.1
Host: localhost:5001

HTTP/1.1 200 OK
Date: Thu, 23 Sep 2021 12:10:51 GMT
Server: Kestrel
Content-Length: 26

https://localhost:5001/foo
GET http://localhost:5000/bar HTTP/1.1
Host: localhost:5000

HTTP/1.1 307 Temporary Redirect
Content-Length: 0
Date: Thu, 23 Sep 2021 12:10:57 GMT
Server: Kestrel
Location: https://localhost:5001/bar
GET https://localhost:5001/bar HTTP/1.1
Host: localhost:5001

HTTP/1.1 200 OK
Date: Thu, 23 Sep 2021 12:10:57 GMT
Server: Kestrel
Content-Length: 26

https://localhost:5001/bar

到了這里,關于ASP.NET Core 6框架揭秘實例演示[37]:重定向的N種實現方式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 《深入淺出.NET框架設計與實現》筆記6.2——ASP.NET Core應用程序多種運行模式之二——IIS 服務承載

    ?ASP.NET Core應用程序可以在多種運行模式下運行,包括自宿主(Self-Hosting)、IIS服務承載、桌面應用程序、服務承載。 因此選擇和時的模式很重要。 IIS 服務承載 將 ASP.NET Core 應用程序托管在 Internet Information Services (IIS) 中。 利用 IIS 提供的高級功能,如負載均衡、HTTPS 支持和

    2024年04月26日
    瀏覽(21)
  • asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng)

    asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng)

    作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/131458964 asp.net core 框架搭建2-搭建MVC后臺管理系統(tǒng) ,本文章介紹asp.net core框架搭建,然后開發(fā)一個后臺管理系統(tǒng),將一步步帶著大家,實現目標。所有操作過程將展現在本篇文章,下面咋們一起來實現它吧。 使

    2024年02月12日
    瀏覽(20)
  • 【ASP.NET Core 基礎知識】--MVC框架--Models和數據綁定

    Models和數據綁定在ASP.NET Core MVC中扮演著關鍵的角色,對于構建強大、靈活和可維護的Web應用程序至關重要。這一節(jié)我們就來講一下。 一、Models 1.1 Models的定義和作用 在ASP.NET Core MVC中,Model是應用程序中用于表示數據結構和業(yè)務邏輯的一種抽象。Models充當了MVC(Model-View-Contr

    2024年01月23日
    瀏覽(94)
  • asp.net core框架搭建1-搭建webapi,對數據增刪改查接口模板(附源碼)

    asp.net core框架搭建1-搭建webapi,對數據增刪改查接口模板(附源碼)

    作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/131458922 asp.net core 框架搭建2-搭建webapi ,本文章介紹asp.net core webapi框架搭建,然后開發(fā)增刪改查和工具接口,將一步步帶著大家,實現目標。所有操作過程將展現在本篇文章,下面咋們一起來實現它吧。 asp.ne

    2024年02月13日
    瀏覽(21)
  • dotnet 簡單方法在一個進程內同時跑起 WPF 和 ASP.NET Core 框架

    dotnet 簡單方法在一個進程內同時跑起 WPF 和 ASP.NET Core 框架

    從設計架構上,無論是 WPF 還是 ASP.NET Core 框架,都是在 dotnet 運行時上層的應用,兩個框架處于平級的結構。理論上講,兩個平級的框架只要不存在特殊的情況,都是能夠相容存在的。本文將和大家介紹一個非常簡單的方法,在一個進程內同時跑起 WPF 和 ASP.NET Core 框架 在一

    2024年04月26日
    瀏覽(30)
  • 如何在ASP.NET Core應用中實現與第三方IoC/DI框架的整合?

    如何在ASP.NET Core應用中實現與第三方IoC/DI框架的整合?

    我們知道整個ASP.NET Core建立在以ServiceCollection/ServiceProvider為核心的DI框架上,它甚至提供了擴展點使我們可以與第三方DI框架進行整合。對此比較了解的讀者朋友應該很清楚,針對第三方DI框架的整合可以通過在定義Startup類型的ConfigureServices方法返回一個ServiceProvider來實現。但

    2024年02月09日
    瀏覽(32)
  • 關于ASP.NET Core WebSocket實現集群的思考

    關于ASP.NET Core WebSocket實現集群的思考

    前言 ????提到 WebSocket 相信大家都聽說過,它的初衷是為了解決客戶端瀏覽器與服務端進行雙向通信,是在單個 TCP 連接上進行全雙工通訊的協(xié)議。在沒有WebSocket之前只能通過瀏覽器到服務端的請求應答模式比如輪詢,來實現服務端的變更響應到客戶端,現在服務端也可以主

    2024年04月14日
    瀏覽(22)
  • ASP.NET Core + Jenkins實現自動化發(fā)布

    ASP.NET Core + Jenkins實現自動化發(fā)布

    ??作者:科技、互聯(lián)網行業(yè)優(yōu)質創(chuàng)作者 ??專注領域:.Net技術、軟件架構、人工智能、數字化轉型、DeveloperSharp、微服務、工業(yè)互聯(lián)網、智能制造 ??歡迎關注我(Net數字智慧化基地),里面有很多 高價值 技術文章, 是你刻苦努力也積累不到的經驗 ,能助你快速成長。升職

    2024年02月22日
    瀏覽(22)
  • ASP.NET Core+Vue3 實現SignalR通訊

    ASP.NET Core+Vue3 實現SignalR通訊

    從ASP.NET Core 3.0版本開始,SignalR的Hub已經集成到了ASP.NET Core框架中。因此,在更高版本的ASP.NET Core中,不再需要單獨引用Microsoft.AspNetCore.SignalR包來使用Hub。 在項目創(chuàng)建一個類繼承Hub, 首先是寫一個CreateConnection方法 ConnectionId是SignalR中標識的客戶端連接的唯一標識符, 將userId和

    2024年02月06日
    瀏覽(26)
  • 2步輕松實現ASP.NET Core托管服務執(zhí)行定時任務

    2步輕松實現ASP.NET Core托管服務執(zhí)行定時任務

    最近接到一個新項目,需要在項目里添加一個后臺任務,定時去發(fā)郵件通知客戶;由于是一個比較小型的項目,不希望引入Quartz.Net、Hangfire等太重的框架,同時也沒持久化要;尋覓了一下發(fā)現ASP.NET Core本身帶有托管服務,可以執(zhí)行定時任務。ASP.NET Core提供了IHostedService接口,

    2024年02月06日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包