dotnet core 不自动从 https 到 http 的 302 重定向
本文记录一个已知问题,或者准确来说是设计如此的行为,在 dotnet core 下,无论是 dotnet core 3.1 还是 dotnet 5 或 dotnet 6 或 dotnet 7 等,如果访问的 https 链接返回 302 状态码,且跳转的链接是一个 http 链接,那将不会自动跳转
默认情况下,咱可以通过设置 HttpClient 的 HttpClientHandler 从而设置 AllowAutoRedirect 属性,让 HttpClient 自动执行 302 跳转,且可以加上 MaxAutomaticRedirections 设置允许最大的跳转次数
private static HttpClient _httpClient = new HttpClient
(
new HttpClientHandler
{
AllowAutoRedirect = true,
MaxAutomaticRedirections = 2
}
);
对应的,在 dotnet 6 或更高的版本,可以使用 SocketsHttpHandler 代替 HttpClientHandler 类型,代替之后的代码其实也差不多,请看以下代码,更多请看 dotnet 6 HttpClientHandler 和 SocketsHttpHandler 有什么差别
HttpMessageHandler handler = new SocketsHttpHandler()
{
AllowAutoRedirect = true,
MaxAutomaticRedirections = 10,
};
using var httpClient = new HttpClient(handler);
这在大部分情况下都能正常工作,但是如果所访问的链接是一个 https 链接,且此链接返回 302 跳转到一个 http 链接上,那使用 HttpClient 将不会自动跳转,而是返回 302 的状态码,且在 Header 的 Location 上写明了后台返回的 http 链接
这是 dotnet core 的设计如此,可以通过本文的参考看到大佬们的讨论
由于从 https 跳转到 http 在大部分时候来说,都是十分诡异的行为。默认不要让 HttpClient 帮助自动跳转也是十分符合预期的行为
如果自己明确知道没有问题,那就自己加上跳转的代码吧
如以下的例子代码,先判断 StatusCode 是 Redirect 然后拿 Headers.Location 重新访问
var httpResponseMessage = await httpClient.GetAsync(url);
var resultResponseMessage = httpResponseMessage;
if (httpResponseMessage.StatusCode == HttpStatusCode.Redirect)
{
var location = httpResponseMessage.Headers.Location;
if (location is not null)
{
var newResponseMessage = await httpClient.GetAsync(location);
resultResponseMessage = newResponseMessage;
}
else
{
// 理论上不能为空吧,抛个异常还是返回就看你业务
}
}
默认行为禁止 https->http 的跳转,是一个很合理的设计。如果明确知道后台想要如此行为,最好先去将后台的伙伴打一顿,如果打不过,再考虑按照以上代码的方式更改
参考:
HttpClient does not follow 302 redirects · Issue #23801 · dotnet/runtime
HttpClient follow 302 redirects with .NET Core Brian Pedersen's Sitecore and .NET Blog
dotnet core 不自动从 https 到 http 的 302 重定向的更多相关文章
- dotnet core 跨平台编译发布
vs2017 建立的项目,在项目目录 ,执行 dotnet publish -r ubuntu.15.04-x64 dotnet publish -r linux-x64 dotnet publish ...
- 用dotnet core 搭建web服务器(一)http server
环境说明 dotnet core,开发需要安装dotnetcore sdk,运行需要安装 dotnetcore runtime 运行目前几乎支持所有常见平台 开发推荐windows10 平台 首先安装 ...
- Linux - 安装 dotnet core 环境
Linux - 安装 dotnet core 环境 系统环境:CentOS7 官方安装指导 https://www.microsoft.com/net/learn/get-started/linux ...
- dotnet core 也能协调分布式事务啦!
2022 年 5 月 24 日,我们发布了 DBPack v0.1.0 版本,该版本主要 release 了分布式事务功能.在我们的规划里,DBPack 是要支持所有微服务开发语言协调分布式事务的,但 ...
- 手把手教你用Jenkins自动发布dotnet core程序
Jenkins部分 首先,我们要有个Jenkins咯,下载链接:https://jenkins.io/download/ 我们安装官网教程安装好jenkins,安装教程略.... 嗯?不是说好手把手么 ...
- dotnet Core Asp.net 项目搭建
Asp.Net Core 介绍 Asp.Net Core 目前最新版本 1.0.0-preview2-003131 Asp.Net Core官网:https://dotnet.github.io/ A ...
- dotnet core多平台开发体验
前言 随着net core rc2的发布,园子里面关于net core的入门文章也也多了起来,但是大多数都是在一个平台上面来写几个简单的例子,或者是在解释代码本身,并没有体现说在一个平台上面创建一个项 ...
- 基于DotNet Core的RPC框架(一) DotBPE.RPC快速开始
0x00 简介 DotBPE.RPC是一款基于dotnet core编写的RPC框架,而它的爸爸DotBPE,目标是实现一个开箱即用的微服务框架,但是它还差点意思,还仅仅在构思和尝试的阶段.但不管怎么 ...
- spring cloud+dotnet core搭建微服务架构:配置中心(四)
前言 我们项目中有很多需要配置的地方,最常见的就是各种服务URL地址,这些地址针对不同的运行环境还不一样,不管和打包还是部署都麻烦,需要非常的小心.一般配置都是存储到配置文件里面,不管多小的配置变动, ...
- 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)
作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https ...
随机推荐
- 详解SSL证书系列(6)了解HTTP及网络基础
使用HTTP协议访问Web 你知道当我们在网页浏览器(比如Chrome)的地址栏中输入URL时,Web网页是如何呈现的吗? Web页面当然不会凭空显示出来.根据Web浏览器地址栏中指定的URL,W ...
- C# 调用C++DLL时释放非托管内存
方法一 改变非托管内存的分配方法,将其修改成采用COM的内存分配方法CoTaskMemAlloc来分配内存.这样封送拆收器在释放非托管内存时,就能自动调用COM的内存释放方法CoTaskMemFree ...
- CentOS 安装webmin
下载地址 http://download.webmin.com/download/yum/ 安装依赖 sudo yum -y install openssl perl perl-Net-SSLeay ...
- C# 委托(delegate)本质理解
代码如下,很简单 namespace Delegate { class Program { delegate void SayHi(); void SayHi_1() { Console.WriteL ...
- virtualbox安装windows10出现OOBE,卡在OOBE。
参照 https://zhuanlan.zhihu.com/p/419237209 https://www.0z.gs/win/781.html 文档 https://learn.microsoft. ...
- Manacher小记
目录 前言 洛谷 3805[模板]manacher算法 题目 分析 代码 洛谷 4555 最长双回文串 题目 分析 代码 洛谷 1659 拉拉队排练 题目 分析 代码 前言 皆移植于原csdn博客,略 ...
- 使用OHOS SDK构建cityhash
参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone https://github.com/google/cityhash.git 从v ...
- 【直播回顾】OpenHarmony知识赋能第八期:手把手教你实现涂鸦小游戏
OpenHarmony第八期知识赋能直播已经在9月29日圆满落幕!从9月15日起,资深OS框架开发工程师巴延兴老师于每周四进行分享,通过实现涂鸦小游戏来帮助大家全面了解ArkUI框架的应用,拓宽知识 ...
- Docker 12 Dockerfile
简介 Dockerfile 是用来构建 Docker 镜像的文件,可以理解为命令参数脚本. Dockerfile 是面向开发的,想要打包项目,就要编写 Dockerfile 文件. 由于 Docker ...
- HMS Core分析服务智能运营6.5.1版本上线
HMS Core分析服务智能运营6.5.1版本上线,三大"更"新,助力开发者提升运营体验. 1.活动效果更前置:支持受众预估,提前判断活动效果: 2.活动流程更规范:新增活动审核功 ...