如何在 ASP.NET Core 中使用 URL Rewriting 中间件

URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 ASP.NET Core 中对 url 进行 rewriting。

安装 URL Rewriting 中间件

要想使用 URL Rewriting 功能,需要通过 nuget 引用 Microsoft.AspNetCore.Rewrite 包,可以通过 Visual Studio 2019 的 NuGet package manager 可视化界面安装 或者 通过 NuGet package manager 命令行工具输入以下命令:


dotnet add package Microsoft.AspNetCore.Rewrite

url重定向 和 url重写

url重定向url重写 是两个完全不同的概念,url重定向是 server 端返回 Http Status Code 301 或者 302 给 客户端并且告诉客户端使用另一个链接访问资源,客户端拿到新链接后实现跳转,从这个过程中可以看出,这个操作是发生在客户端,而且还多了一个不可回避的 round-trip

相反,url重写 是server端的操作,它会根据预先指定的一组规则去修改request url,在 rewriting 的过程中,修改后的 request url 不会和 重定向 一样再发送给客户端,只要是在一个请求内,client 根本不关心 server 端内部是如何实现资源切换的,值得注意的是,URL rewriting 也不是什么新的技术,在 ASP.NET 时代就有了。

总的来说,url重写 是发生在 server 端,并且没有所谓的 round-trip

配置 url 重定向

可以在 Startup 类中进行 URL rewritingURL redirection 功能配置,举个例子,实现 http 请求自动跳转成 https。

public class Startup{public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseRewriter(new RewriteOptions().AddRedirectToHttps());}}

配置 URL rewriting

下面的代码展示了 URL rewriting,请注意 request url 已经被 AddRewrite 的规则所监视。

public class Startup{public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");}app.UseStaticFiles();//rewritevar rewrite = new RewriteOptions().AddRewrite("Home/Index", "Home/Privacy", true);app.UseRewriter(rewrite);app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});}}

从图中可以看出,url 请求的是 Home/Index,显示的是 Home/Privacy 内容,如果你有更加复杂的业务需求,可以使用 正则表达式 来定义规则,如下代码所示:

var rewrite = new RewriteOptions().AddRewrite(@"^Home/User?Code=(\d+)", "Home/$1", true);app.UseRewriter(rewrite);

使用自定义的 URL rewriting

如果正则表达式都不能满足需求,完全可以 自定义 来实现深度定制,只需要实现 IRule 接口中的 ApplyRule 方法即可,如下代码所示:

public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule{public void ApplyRule(RewriteContext context){throw new NotImplementedException();}}

下面的代码展示了如何使用 ApplyRule,不过这里只是为了演示目的,你可以根据自己的需求来实现。

public class CustomRule : Microsoft.AspNetCore.Rewrite.IRule{public void ApplyRule(RewriteContext context){var request = context.HttpContext.Request;var host = request.Host;if (host.Host.Contains("localhost",StringComparison.OrdinalIgnoreCase)){if(host.Port == 80){context.Result = RuleResult.ContinueRules;return;}               }var response = context.HttpContext.Response;response.StatusCode = (int)HttpStatusCode. BadRequest;context.Result = RuleResult.EndResponse;}}

将 自定义规则 添加到 rule 集合

可以在 Startup.Configure 方法中将自定义的rule规则添加到 rule 集合中,如下代码所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env){var options = new RewriteOptions();options.Rules.Add(new CustomRule())app.UseRewriter(options);}

总结一下:URL rewriting 切断了 url地址 和 资源 的映射关系,你可以利用这项技术定义一些非常语义化的 url 地址,也方便 搜索引擎 收录。

译文链接:https://www.infoworld.com/article/3445867/how-to-use-url-rewriting-middleware-in-aspnet-core.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

睡眠分期matlab代码,非接触式睡眠分期方法与流程

本发明属于雷达监测技术领域,特别是一种非接触式睡眠分期方法。背景技术:传统的呼吸睡眠监护系统主要依靠贴附于人体的接触式传感器、电极进行测量,从而实时获得人体的生命参数信号,这些方法都需要直接或间接地接触人体&#xff0…

叮咚!你有一份来自明源云的圣诞邀约

请查收,来自明源云的圣诞邀约~

java先进先出 循环队列,JavaScript队列、优先队列与循环队列

队列是一种遵从先进先出(FIFO)原则的有序集合队列在尾部添加新元素,从顶部移除元素队列的理解队列在我们生活中最常见的场景就是排队了队列这个名字也已经很通俗易懂了和栈很像,这不过队列是先入先出的数据结构队列的前面是队头队列的后面是队尾出队从队…

Abp小试牛刀之 图片上传

图片上传是很常见的功能,里面有些固定的操作也可以沉淀下来。本文记录使用Abp vNext做图片上传的姿势。目标上传图片----->预览图片----->确定保存支持集群部署实现思路:1. 上传图片要使用WebAPI特定媒体类型:multipart/form-data;2. 因…

.Net Conf 2020 之回顾

Intro上周 .NET Conf 在苏州成功举办了第二届活动,一年一度的 .NET 盛会又来了,今年大会依然有许多从外地过来参加的开发者们,也有很多讲师也是从外地赶过来为我们分享。虽然今年是疫情的一年,并没有影响 .NET Conf 参会者们的热情…

如何使用 C# 在异步代码中处理异常

异常处理是一种处理运行时错误的技术,而 异步编程 允许我们在处理资源密集型的业务逻辑时不需要在 Main 方法或者在 执行线程 中被阻塞,值得注意的是,异步方法和同步方法的异常处理机制是不一样的,本篇我们就来讨论下如何在异步方…

对 Redis 中的有序集合SortedSet的理解

本篇说一下Redis中的 有序集合类型,曾几何时,我们想把所有数据存到内存中的 数据结构 中,但为了多机器共享内存,不得不将这块内存包装成wcf单独部署,同时还要考虑怎么序列化,烦心事太多太多。。。后来才知道…

代码质量在「内卷时代」的重要性

这里是Z哥的个人公众号每周五11:45 按时送达当然了,也会时不时加个餐~我的第「173」篇原创敬上大家好,我是Z哥。提到代码质量,不知道你的脑海中浮现出的第一个词是什么?规范?可读性?…

.NET Core AWS S3云存储

【导读】最近有需要用到AWS S3云存储上传附件,这里对利用.NET或.NET Core在调用SDK APi需要注意的一点小问题做个记录,或许能对后续有用到的童鞋提供一点帮助Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供行业领先的可…

MiniProfiler,一个.NET简单但有效的微型分析器

背景MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC的性能分析的小程序。可以对一个页面本身,及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL(支持EF、EF …

龙芯.NET正式发布 稳步推进生态建设

2020年12月19日,2020中国. NET开发者大会于苏州开幕。此次大会上,龙芯发布了龙芯.NET 3。龙芯.NET 3基于.NET Core 3.1,支持该版本具备的所有主要功能,包括GC、AOT等。CoreCLR、CoreFX、ASP.NET Core等库的测试通过情况与x64/arm6…

有温度的技术,改善上亿人的生活

06有温度的技术,改善上亿人的生活鱼小皮哥,现在的 APP 真是越来越难用了,功能多、操作复杂、广告更多。唉,可不是么,而且人们的生活已经离不开 APP 了!老百鱼小皮我爷爷最近的视力下降的很快,用…

Linux链接文件包括,Linux操作系统——系统各目录有什么作用、以及文件链接过程...

三、 Linux 系统目录结构/bin — 用来贮存用户命令。目录 /usr/bin 也被用来贮存用户命令。/sbin — 许多系统命令(例如 shutdown)的贮存位置。目录 /usr/sbin 中也包括了许多系统命令。/root — 根用户(超级用户)的主目录。/mnt — 该目录中通常包括系统引导后被挂载的文件系统…

刚转Java?那准备转回.NET5吧!

再过几天就2021年了,回首今年最大的变化就是.NET5的发布,终结了.NET Framework和.NET Core两个分支。虽然因为新冠疫情原因,原定于.NET5的部分功能被推迟到.NET6了,但.NET5是一个非常非常重要的版本,会载入史册的一个版…

在 xunit 测试项目中使用依赖注入

在 xunit 测试项目中使用依赖注入Intro之前写过几篇 xunit 依赖注入的文章,今天这篇文章将结合我在 .NET Conf 上的分享,更加系统的分享一下在测试中的应用案例。之所以想分享这个话题是因为我觉得在我们开发过程中测试是非常重要的一部分,高…

利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具

利用 C# 中的 FileSystemWatcher 制作一个文件夹监控小工具独立观察员 2020 年 12 月 26 日前一段看到微信公众号 “码农读书” 上发了一篇文章《如何使用 C# 中的 FileSystemWatcher》(翻译自:https://www.infoworld.com/article/3185447/how-to-work-w…

u盘安全删除 linux,为什么要安全删除U盘

原标题:为什么要安全删除U盘移除闪存设备时会对电脑造成危害吗?我们为什么要安全的移除它们?历史上,操作系统将磁盘作为信任对象不需要突然改变状态。当读写文件时,操作系统不希望文件在读写的过程中突然消失。如果文件…

如何在 C# 中使用 投影(Projection)

投影(Projection) 是一种可以将查询结果进行 塑性 的一种操作,你可以使用 投影 将一个 object 转成仅包含你需要属性的新对象,这篇文章中,我们就一起看看如何使用 投影 功能。C# 中的投影 LINQ 集成查询中有两个支持投影的扩展方法&#xff0…

Linux语言写的高通滤波,高通滤波器c语言实现

描述高通滤波器,又称低截止滤波器、低阻滤波器,允许高于某一截频的频率通过,而大大衰减较低频率的一种滤波器。它去掉了信号中不必要的低频成分或者说去掉了低频干扰。高通滤波器是一种让某一频率以上的信号分量通过,而对该频率以…

在 WSL Ubuntu 上使用 .NET 进行跨平台开发新手入门

翻译自 haydenb 2020年6月3日的文章《Getting started with cross-platform development using .NET on Ubuntu on WSL》 [1].NET 是一个开源软件框架,用于在 Linux、Windows 和 macOS 上构建跨平台应用程序。WSL 上的 Ubuntu [2]允许您同时为 Ubuntu 和 Windows 构…