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.mzph.cn/news/283834.shtml

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

相关文章

客户端应用试用限制设计

1.概要最近接到公司安排的任务给客户端设计一个“试用30天”的一个需求,其功能主要是为了防止客户拿到产品之后不支付尾款继续使用。众所周知靠纯软件想防“盗版”,“限制试用”等做法是行业难题。只要价值足够高一定有人会破解绕过你的所有防线达到免费…

【开发工具之Spring Tool Suite】6、用Spring Tool Suite简化你的开发

如果你是一个喜欢用spring的人,你可能会在欣赏spring的强大功能外,对其各样的配置比较郁闷,尤其是相差较大的版本在配置文件方面会存在差异,当然你可以去花不少的时间去网上查找相关的资料,当你准备使用更高版本spring…

康威定律,作为架构师还不会灵活运用?

Soft skills are always hard than hard skills. 软技能比硬技能难。 老板听说最近流行“微服务”,问架构师咱们的系统要不要来一套?老板又听说最近流行“中台系统”,问架构师咱们要不要搞起来?其实,这些问题不用老板问…

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 * 查询存储过…

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 ● 应用分享 ○ 所有软件的镜像放到一…

程序员双手飞快敲键盘的时候是在敲代码吗?

当你看到一个程序员的两只手在键盘上上下翻飞,行云流水的时候,多半不是在敲击代码大概率是在跟产品经理撕逼讨论需求另一种可能就是在跟测试打口水仗10%几率是在论坛码字摸鱼或者和人家开喷了。1%几率是在跟MM聊天可以手速飞快而不需要停下思考的代码&am…

几分钟上线一个网站 真是神器

1、ToolJet 简介 ToolJet 是一个开源的低代码框架,可以快速构建和部署内部工具,而无需工程团队付出太多努力。您可以连接到您的数据源,例如数据库(如 PostgreSQL、MongoDB、Elasticsearch 等)、API 端点(To…

移植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来控制板…

WinForm(六)组合布局属性

WinForm是基于控件的,不像codemark的架构,可以非常灵活的用mark来布局,它只能用控件布局属性和窗口控件来完成对UI的布局。容器控件有一组控件叫容器控件,对布局特别有作用,它们分别是:TableLayoutPanel&am…

Qt 网络编程

QT 网络编程 TCP 编程 模块引入 QT network 头文件 #include <QTcpServer> // TCP服务器端使用 #include <QTcpSocket> // TCP服务器和客户端都使用 编程流程 服务端 1&#xff09;实例化 QTcpServer 对象 -----------------------------> socket 2&#x…

日利率

2019独角兽企业重金招聘Python工程师标准>>> 利率计算 转载于:https://my.oschina.net/u/3342652/blog/1649028

Kafka 安装详解

注意&#xff1a;确保有JDK1.8版本及以上 官方文档&#xff1a;https://kafka.apache.org/quickstart 清华镜像下载&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/ 首先下载安装包&#xff0c;在linux及Windows都可以使用。 1. Centos 安装部署 1.1 下载 将下…

【Maui正式版】创建可跨平台的Maui程序,以及有关依赖注入、MVVM双向绑定的实现和演示...

前言&#xff1a;Maui终于在2022年8月9日推送出来了。今儿就迫不及待来把玩一下先。A、我本地已有VS2022&#xff0c;不过版本比较老&#xff0c;此处选择更新。工具 -> 获取功能和更新里面&#xff0c;可以获取到新版本更新。B、最新版本是17.3.0&#xff0c;我本地只有17.…

WebSQL存储

2019独角兽企业重金招聘Python工程师标准>>> WebSQL这种存储技术&#xff0c;相对于学过数据库的人来说&#xff0c;还是比较容易理解和上手的&#xff0c;主要就是它的存储风格和我们一般所学的SQL Server 和Oracle比较像&#xff0c;对于HTML5来说&#xff0c;当然…

抖音服务器带宽有多大,才能供上亿人同时刷?

最近看到一个有意思的提问&#xff1a;抖音服务器带宽有多大&#xff0c;为什么能够供那么多人同时刷&#xff1f;今天来给小伙伴们科普一下。 抖音&#xff0c;百度&#xff0c;阿里云&#xff0c;腾讯都是自建的数据中心&#xff0c;都是 T 级别出口带宽&#xff08;总出口带…

ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程

通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目&#xff0c;重点关注Host.CreateDefaultBuilder(args)中的执行过程&#xff0c;主要包括主机配置、应用程序配置、日志配置和依赖注入配置这4个部分。由于水平和篇幅有限&#xff0c;先整体理解、建立框架&#xf…

404和302

为什么80%的码农都做不了架构师&#xff1f;>>> 404 php中用header()函数是可以为返回页面添加404的头信息的&#xff0c;从而提示浏览器该网页找不到了。 所以可以使用&#xff1a;header("HTTP/1.0 404 Not Found");或者&#xff1a;header("Stat…