Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ASP.NET Core 6框架揭秘实例演示[37]:重定向的N种实现方式

ASP.NET Core 6框架揭秘实例演示[37]:重定向的N种实现方式

作者头像
蒋金楠
发布于 2023-07-10 01:29:59
发布于 2023-07-10 01:29:59
52700
代码可运行
举报
文章被收录于专栏:大内老A大内老A
运行总次数:0
代码可运行

在HTTP的语义中,重定向一般指的是服务端通过返回一个状态码为3XX的响应促使客户端像另一个地址再次发起请求,本章将此称为“客户端重定向“。既然有客户端重定向,自然就有服务端重定向,本章所谓的服务端重定向指的是在服务端通过改变请求路径将请求导向另一个终结点。ASP.NET下的重定向是通过RewriteMiddleware中间件实现的。(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)

[S2501]客户端重定向

我们可以为RewriteMiddleware中间件定义客户端重定向规则使之返回一个Location报头指向重定向地址的3XX响应。客户端(比如浏览器)在接收到这样的响应后会根据状态码约定的语义向重定向地址重新发起请求,我们将这种由客户端对新的地址重新请求的方式称为“客户端重定向”。

下面演示的这个例子会将请求路径以“foo/**”为前缀的请求重定向到新的路径“/bar/**”。如代码片段所示,我们通过调用UseRewriter扩展方法注册了RewriteMiddleware中间件,该方法会将对应的RewriteOptions配置选项作为参数。我们直接调用构造函数创建的这个RewriteOptions对象,并调用其AddRedirect扩展方法添加了一个重定向规则,该方法定义了两个参数,前者(“^/foo/(.*)”)代表参与重定向的原始路径模式(正则表达式),后者(“baz/11”表示在进行正则匹配时产生的首段捕获内容(前缀“foo/”后面的部分)。请求的URL会作为响应的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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”路径下。

图1 客户端重定向

整个过程涉及HTTP报文交换更能体现客户端重定向的本质。如下所示的是整个过程涉及的两次报文交换,我们可以看出服务端第一次返回的是状态码为302的响应,根据映射规则生成的重定向地址体现在Location报头上。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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对象被创建后,我们调用它的另一个AddRewrite扩展方法注册了一条服务端重定向(URL重写)规则,原始请求路径的正则表达式和重定向路径均保持不变。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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”)对站点发起请求,我们会得到如图2所示的相同的响应内容。由于这次采用的是服务端重定向,整个过程只会涉及一次报文交换,所以浏览器的请求地址不会改变。

图2 服务端重定向

[S2503]采用IIS重写规则实现重定向

重定向是绝大部分Web服务器(比如IIS、Apache和Nginx等)都会提供的功能,但是不同的服务器类型针对重定向规则具有不同的定义方式。IIS中的重定向被称为“URL重写”,具体的URL重写规则采用XML格式进行定义,RewriteMiddleware中间件对它提供了原生的支持。我们将URL重写规则以如下的方式定义在创建的rewrite.xml文件中,并将该文件保存在演示项目的根目录下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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}”的规则,这里的占位符“{R:1}”和前面定义的“$1”一样,都表示针对初始请求路径进行正则匹配时得到的第一段捕获内容。两条规则用来匹配原始路径的正则表达式分别定义为“^foo/(.*)”和“^bar/(.*)”。它们采用的Action类型也不相同,前者为“Redirect”,表示客户端重定向;后者为“Rewrite”,表示服务端重定向。

为了将采用XML文件定义的IIS重定向规则应用到演示程序中,我们对演示程序如下的修改。如代码片段所示,在RewriteOptions对象被创建出来后,我们调用了它的AddIISUrlRewrite扩展方法添加了IIS URL重写规则,该方法的两个参数分别表示用来读取规则文件的IFileProvider对象和规则文件针对该对象的路径。由于规则文件存储与项目根目录下,这也是ASP.NET应用“内容根目录”所在的位置,所以我们可以使用内容根目录对应的IFileProvider对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();

改动的程序启动之后,我们针对添加的两条重定向规则发送了对应的请求,它们采用的请求路径分别为“/foo/abc/123”和“/bar/abc/123”。从图3所示的输出可以看出,这两个请求均被重定向到相同的目标路径“/baz/abc/123”。

图3 IIS重定向规则

由于发送的两个请求分别采用客户端和服务端重定向方式导向新的地址,所以浏览器针对前者显示的是重定向后的地址,对于后者则显示原始的地址。整个过程涉及到的如下三次报文交互更能说明两种重定向方式的差异,从报文内容我们可以进一步看出第一次采用的是响应状态码为301的永久重定向。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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重写规则实现重定向

上面我们演示了RewriteMiddleware中间件针对IIS重定向规则的支持,实际上该中间件还支持Apache的重定向模块mod_rewriter所采用的重定向规则定义形式,我们照例来做一个简单的演示。我们在项目根目录下添加了一个名为rewrite.config的配置文件,并在其中定义了如下两条重定向规则。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule ^/foo/(.*) /baz/$1 [R=307]
RewriteRule ^/bar/(.*) - [F]

上面第一条规则利用R这个Flag将路径与正则表达式“^/foo/(.*)”相匹配的请求以重定向到新的路径“/baz/$1”,具体采用的是针对状态码307的临时客户端重定向。对于其路径与正则表达式“^/bar/(.*)”相匹配的请求,我们将它视为未经授权授权的请求,所以对应的规则采用F(Forbidden)这个Flag。为了让演示程序采用上述这个配置文件定义的Apache重定向规则,我们只需要按照如下的方式调用RewriteOptions 对象的AddApacheModRewrite扩展方法就可以了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();

改动的程序启动之后,我们针对添加的两条重定向规则发送了对应的请求,它们采用的请求路径分别为“/foo/abc/123”和“/bar/abc/123”。从图4所示的输出可以看出,第一个请求均被重定向到相同的目标路径“/baz/abc/123”,第二个请求返回一个状态码为403的响应。

图4Apache mod­_rewrite重定向规则

如下所示的是整个过程涉及到的三次报文交换。我们可以看出第一次请求得到的响应状态码正式我们在规则中显式设置的307。第二个请求由于被视为权限不足,服务端直接返回一个状态为“403 Forbidden”的响应。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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作为响应的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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创建出来的。该方法调用当前WebApplication对象的CreateApplicationBuilder方法创建了一个新的IApplicationBuilder对象,并调用后者的UseRewriter扩展方法注册了RewriteMiddleware中间件。我们为该中间件提供的HTTPS重定向规则是通过调用RewriteOptions对象的AddRedirectToHttps扩展方法定义的,该方法时指定了重定向响应采用的状态码(302和307)和HTTPS终结点采用的端口号。改动的程序启动之后,针对两个终结点的HTTP请求(“http://localhost:5000/foo”和“http://localhost:5000/bar”)均以图5所示的形式被重定向到了对应的HTTPS终结点。

图5 HTTPS重定向

整个过程涉及到如下四次报文交换,我们可以看出我们通过调用AddRedirectToHttps扩展方法定义的规则采用的是客户端重定向。重定向响应采用了我们设置的状态码,分别是“302 Found”和“307 Temporary Redirect”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core 6框架揭秘实例演示[36]:HTTPS重定向
HTTPS是确保传输安全最主要的手段,并且已经成为了互联网默认的传输协议。不知道读者朋友们是否注意到当我们利用浏览器(比如Chrome)浏览某个公共站点的时候,如果我们输入的是一个HTTP地址,在大部分情况下浏览器会自动重定向到对应HTTPS地址。这一特性源于浏览器和服务端针对HSTS(HTTP Strict Transport Security)这一HTTP规范的支持。ASP.NET利用HstsMiddleware和HttpsRedirectionMiddleware这两个中间件提供了对HSTS的实现。(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2023/06/09
7670
ASP.NET Core 6框架揭秘实例演示[36]:HTTPS重定向
ASP.NET Core 6框架揭秘实例演示[41]:跨域资源的共享(CORS)N种用法
同源策略是所有浏览器都必须遵循的一项安全原则,它的存在决定了浏览器在默认情况下无法对跨域请求的资源做进一步处理。为了实现跨域资源的共享,W3C制定了CORS规范。ASP.NET利用CorsMiddleware中间件提供了针对CORS规范的实现。(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2023/07/10
3940
ASP.NET Core 6框架揭秘实例演示[41]:跨域资源的共享(CORS)N种用法
ASP.NET Core 6框架揭秘实例演示[34]:缓存整个响应内容
我们利用ASP.NET开发的大部分API都是为了对外提供资源,对于不易变化的资源内容,针对某个维度对其实施缓存可以很好地提供应用的性能。《内存缓存与分布式缓存的使用》介绍的两种缓存框架(本地内存缓存和分布式缓存)为我们提供了简单易用的缓存读写编程模式,本篇介绍的则是针对针对HTTP响应内容实施缓存,ResponseCachingMiddleware中间件赋予我们的能力(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)。
蒋金楠
2022/09/28
6620
ASP.NET Core 6框架揭秘实例演示[32]:错误页面的N种呈现方式
由于ASP.NET是一个同时处理多个请求的Web应用框架,所以在处理某个请求过程中出现异常并不会导致整个应用的中止。出于安全方面的考量,为了避免敏感信息外泄,客户端在默认情况下并不会得到详细的出错信息,这无疑会在开发过程中增加查错和纠错的难度。对于生产环境来说,我们也希望最终用户能够根据具体的错误类型得到具有针对性并且友好的错误消息。ASP.NET提供的相应的中间件可以帮助我们将定制化的错误信息呈现出来。本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/09/21
7810
ASP.NET Core 6框架揭秘实例演示[32]:错误页面的N种呈现方式
ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法
ASP.NET的路由是通过EndpointRoutingMiddleware和EndpointMiddleware这两个中间件协作完成的,它们在ASP.NET平台上具有举足轻重的地位,MVC和gRPC框架,Dapr的Actor和发布订阅编程模式都建立在路由系统之上。Minimal API更是将提升到了前所未有的高度,上一篇通过9个实例演示了基于路由的REST API开发,本篇演示一些“高阶”的用法。
蒋金楠
2022/09/19
7180
ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法
ASP.NET Core 6框架揭秘实例演示[42]:检查应用的健康状况
现代化的应用及服务的部署场景主要体现在集群化、微服务和容器化,这一切都建立在针对部署应用或者服务的健康检查上。ASP.NET提供的健康检查不仅可能确定目标应用或者服务的可用性,还具有健康报告发布功能。ASP.NET框架的健康检查功能是通过HealthCheckMiddleware中间件完成的。我们不仅可以利用该中间件确定当前应用的可用性,还可以注册相应的IHealthCheck对象来完成针对不同方面的健康检查。(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2023/07/10
3100
ASP.NET Core 6框架揭秘实例演示[42]:检查应用的健康状况
ASP.NET Core静态文件中间件[2]: 条件请求以提升性能
通过调用IApplicationBuilder接口的UseStaticFiles扩展方法注册的StaticFileMiddleware中间件旨在处理针对文件的请求。对于StaticFileMiddleware中间件处理请求的逻辑,大部分读者都应该想得到:根据请求的地址找到目标文件的路径,然后利用注册的IContentTypeProvider对象解析出与文件内容相匹配的媒体类型,后者将其作为响应报头Content-Type的值。StaticFileMiddleware中间件最终利用IFileProvider对象读取文件的内容,并将其作为响应报文的主体。
蒋金楠
2020/12/17
6150
通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[下篇]:参数绑定
模拟框架到目前为止都假定Action方法是没有参数的,我们知道MVC框架对Action方法的参数并没有作限制,它可以包含任意数量和类型的参数。一旦将“零参数”的假设去除,ControllerActionInvoker针对Action方法的执行就变得没那么简单了,因为在执行目标方法之前需要绑定所有的参数。MVC框架采用一种叫做“模型绑定(Model Binding)”的机制来绑定目标Action方法的输出参数,这可以算是MVC框架针对请求执行流程中最为复杂的一个环节,为了让读者朋友们对模型绑定的设计和实现原理有一个大致的了解,模拟框架提供一个极简版本的实现。
蒋金楠
2020/04/01
1.3K0
通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[下篇]:参数绑定
ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法
NuGet包“Microsoft.AspNetCore.Diagnostics”中提供了几个与异常处理相关的中间件,我们可以利用它们将原生的或者定制的错误信息作为响应内容发送给客户端。《错误页面的N种呈现方式》演示了几个简单的实例使读者大致了解这些中间件的作用,现在我们来演示几个高阶用法。本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/09/23
1.2K0
ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法
ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求。对于StaticFileMiddleware处理请求的逻辑,大部分读者都应该想得到:它根据请求的地址找到目标文件的路径,然后利用注册的ContentTypeProvider根据路径解析出与文件内容相匹配的媒体类型,默认情况下得到的媒体类型是根据目标文件的扩展名解析出来的。解析出来的媒体类型将作为响应报头Content-Type的值。StaticFi
蒋金楠
2018/01/15
3.1K0
ASP.NET Core静态文件中间件[3]: 区间请求以提供部分内容
大部分针对物理文件的请求都希望获取整个文件的内容,区间请求则与之相反,它希望获取某个文件部分区间的内容。区间请求可以通过多次请求来获取某个较大文件的全部内容,并实现断点续传。如果同一个文件同时存放到多台服务器,就可以利用区间请求同时下载不同部分的内容。与条件请求一样,区间请求也作为标准定义在HTTP规范之中。
蒋金楠
2020/12/18
5870
ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作——登录和注销。ASP.NET Core利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用于登录、注销以及“质询”的API,本篇文章利用它们使用最简单的代码实现这些功能。(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2023/07/10
2910
ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
模拟ASP.NET Core MVC设计与实现
前几天有人在我的《ASP.NET Core框架揭秘》读者群跟我留言说:“我最近在看ASP.NET Core MVC的源代码,发现整个系统太复杂,涉及的东西太多,完全找不到方向,你能不能按照《200行代码,7个对象——让你了解ASP.NET Core框架的本质》这篇文章思路剖析一下MVC框架”。对于ASP.NET Core MVC框架的涉及和实现,说难也难,毕竟一个Model Binding就够很多人啃很久,其实说简单也简单,因为整个流程是很清晰的。ASP.NET Core MVC支持基于Controller和Page的两种编程模式,虽然编程方式看起来不太一样,底层针对请求的处理流程其实是一致的。接下来,我同样使用简单的代码构建一个Mini版的MVC框架,让大家了解一下ASP.NET Core MVC背后的总体设计,以及针对请求的处理流程。[源代码从这里下载]。
蒋金楠
2023/11/09
3510
模拟ASP.NET Core MVC设计与实现
ASP.NET Core 6框架揭秘实例演示[24]:中间件的多种定义方式
ASP.NET Core的请求处理管道由一个服务器和一组中间件组成,位于 “龙头” 的服务器负责请求的监听、接收、分发和最终的响应,针对请求的处理由后续的中间件来完成。中间件最终体现为一个Func<RequestDelegate, RequestDelegate>委托,但是我们具有不同的定义和注册方式。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
7110
ASP.NET Core 6框架揭秘实例演示[24]:中间件的多种定义方式
ASP.NET Core 6框架揭秘实例演示[38]:两种不同的限流策略
承载ASP.NET应用的服务器资源总是有限的,短时间内涌入过多的请求可能会瞬间耗尽可用资源并导致宕机。为了解决这个问题,我们需要在服务端设置一个阀门将并发处理的请求数量限制在一个可控的范围,即使会导致请求的延迟响应,在极端的情况会还不得不放弃一些请求。ASP.NET应用的流量限制是通过ConcurrencyLimiterMiddleware中间件实现的。(本文提供的示例演示已经同步到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2023/07/10
3640
ASP.NET Core 6框架揭秘实例演示[38]:两种不同的限流策略
ASP.NET Core 6框架揭秘实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient
在一个采用依赖注入框架的应用中,我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用,使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建。前者引起的问题,以及后者带来的好处,将通过如下这几个演示程序展现出来。IHttpClientFactory类型由“Microsoft.Extensions.Http”这个NuGet包提供,“Microsoft.NET.Sdk.Web”SDK具有该包的默认引用。如果采用“Microsoft.NET.Sdk”这个SDK,需要添加该包的引用。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
8460
ASP.NET Core 6框架揭秘实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient
ASP.NET Core 6框架揭秘实例演示[26]:跟踪应用接收的每一次请求
很多人可能对ASP.NET Core框架自身记录的诊断日志并不关心,其实这些日志对纠错排错和性能监控提供了很有用的信息。如果需要创建一个APM(Application Performance Management)系统来监控ASP.NET Core应用处理请求的性能及出现的异常,我们完全可以将HostingApplication对象记录的日志作为收集的原始数据。实际上,目前很多APM(如OpenTelemetry.NET 、Elastic APM和SkyWalking APM等)针对都是利用这种方式收集分布式跟踪日志的。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
6290
ASP.NET Core 6框架揭秘实例演示[26]:跟踪应用接收的每一次请求
ASP.NET Core错误处理中间件[4]: 响应状态码错误页面
StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件类似,它们都是在后续请求处理过程中“出错”的情况下利用一个错误处理器来接收针对当前请求的处理。它们之间的差异在于对“错误”的认定上:ExceptionHandlerMiddleware中间件所谓的错误就是抛出异常;StatusCodePagesMiddleware中间件则将400~599的响应状态码视为错误。更多关于ASP.NET Core的文章请点这里]
蒋金楠
2021/01/27
1.3K0
ASP.NET Core错误处理中间件[4]: 响应状态码错误页面
ASP.NET Core 6框架揭秘实例演示[02]:基于路由、MVC和gRPC的应用开发
ASP.NET Core可以视为一种底层框架,它为我们构建出了基于管道的请求处理模型,这个管道由一个服务器和多个中间件构成,而与路由相关的EndpointRoutingMiddleware和EndpointMiddleware是两个最为重要的中间件。MVC和gRPC开发框架就建立在路由基础上。本篇提供了四个实例用来演示如何利用路由、MVC和gRPC来开发API/APP。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
1K0
ASP.NET Core 6框架揭秘实例演示[02]:基于路由、MVC和gRPC的应用开发
ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中。对于分布式缓存,.NET Core提供了针对Redis和SQL Server的原生支持。除了这个独立的缓存系统之外,ASP.NET Core还借助一个中间件实现了“响应缓存”,它会按照HTTP缓存规范对整个响应实施缓存。不过按照惯例,在对缓存进行系统介绍之前,我们还是先通过一些简单的实例演示感知一下如果在一个ASP.NET Core应用中如何使用缓存。
蒋金楠
2018/02/08
2.6K0
ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
推荐阅读
ASP.NET Core 6框架揭秘实例演示[36]:HTTPS重定向
7670
ASP.NET Core 6框架揭秘实例演示[41]:跨域资源的共享(CORS)N种用法
3940
ASP.NET Core 6框架揭秘实例演示[34]:缓存整个响应内容
6620
ASP.NET Core 6框架揭秘实例演示[32]:错误页面的N种呈现方式
7810
ASP.NET Core 6框架揭秘实例演示[31]:路由&quot;高阶&quot;用法
7180
ASP.NET Core 6框架揭秘实例演示[42]:检查应用的健康状况
3100
ASP.NET Core静态文件中间件[2]: 条件请求以提升性能
6150
通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[下篇]:参数绑定
1.3K0
ASP.NET Core 6框架揭秘实例演示[33]:异常处理高阶用法
1.2K0
ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
3.1K0
ASP.NET Core静态文件中间件[3]: 区间请求以提供部分内容
5870
ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
2910
模拟ASP.NET Core MVC设计与实现
3510
ASP.NET Core 6框架揭秘实例演示[24]:中间件的多种定义方式
7110
ASP.NET Core 6框架揭秘实例演示[38]:两种不同的限流策略
3640
ASP.NET Core 6框架揭秘实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient
8460
ASP.NET Core 6框架揭秘实例演示[26]:跟踪应用接收的每一次请求
6290
ASP.NET Core错误处理中间件[4]: 响应状态码错误页面
1.3K0
ASP.NET Core 6框架揭秘实例演示[02]:基于路由、MVC和gRPC的应用开发
1K0
ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
2.6K0
相关推荐
ASP.NET Core 6框架揭秘实例演示[36]:HTTPS重定向
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文