.NET Core如何进行请求转发?
前言
冒个泡,近日,有关注我公众号的小伙伴私信我,遇到一个问题搞了很久没解决,此问题具有参考意义,这里跟大家分享下,希望对后续可能有需要的你能有所参考和帮助。
请求转发问题
内网环境跟外网隔离,现在外网的请求都需要一个专用服务器转接到内网处理,用app.UseRewriter转接, 从外网服务器转发到内网服务器的时候Header 里面的Authorization 居然丢失了,重新设置RewriteContext.HttpContex Header也不行,有没有办法解决?当时我的想法是,实在不行,在外网将token直接放到url或body里不就完事,这样的话,外网每增加一个接口,都得将token取出然后进行转换,内网以相同方式获取,这是小伙伴所不能忍受。这里我们创建两个Web应用程序,然后添加自定义转发规则。首先我们在第一个Web应用程序创建针对如下接口请求转发规则
public class RewriteForwardRules
{
public static void RedirectRequests(RewriteContext context)
{
var request = context.HttpContext.Request; if (request.Path.Value.StartsWith("/api/forward", StringComparison.OrdinalIgnoreCase))
{
var response = context.HttpContext.Response; response.Headers[HeaderNames.Location] = "http://localhost:8091/api/custom"; context.Result = RuleResult.EndResponse;
}
}
}
然后在startup中注入我们自定义转发规则
app.UseRewriter(new RewriteOptions().Add(RewriteForwardRules.RedirectRequests));
当然,如果URL(GET请求)或Body(POST请求)中包含其他参数,将其对应转发写入URL或Body即可,这里token已存储在请求头中,所以我们直接转发请求即可。接下来我们通过Postman模拟外网发出如下POST请求

紧接着,我们在第二个Web应用程序中来接收转发请求,并获取token信息
[HttpPost]
public IActionResult Custom()
{
var token = Request.Headers[HeaderNames.Authorization].ToString(); return Ok(token);
}
然后我们一运行,发现结果都没转发到对应内网应用程序,这是为何呢?事实上,转发请求涉及到资源重分配指向另一URL问题,当然我们需要注意的是,既然是转发请求,势必转发者和接受者请求方式必须一致,要不然肯定不行。所以我们必须显式指定重定向状态码,设置为308,如下:


针对状态码308的意思,我们可以参看.NET Core中对于状态码枚举解释:永久重定向,原始请求方式和目标请求方式必须一致,支持原始请求和目标请求同为GET或POST。.NET Core中关于此状态码的解释并不那么详细,我们来到专对状态码官方解释(https://httpstatuses.com/308),这里我贴下谷歌翻译后的中文:308永久重定向:已为目标资源分配了一个新的永久URI,以后对该资源的任何引用都应使用其中一个URI。具有链接编辑功能的客户端应在可能的情况下自动将对有效请求URI 1的引用重新链接到服务器发送的一个或多个新引用。服务器应在响应中生成一个Location头字段,其中包含新的永久URI的首选URI引用。用户代理可以使用位置字段值进行自动重定向。服务器的响应有效负载通常包含简短的超文本注释,其中包含指向新URI的超链接。默认情况下,308响应可缓存;即,除非方法定义或显式缓存控制。
当然,我们也可以设置状态码为301,301永久移动:已为目标资源分配了一个新的永久URI,以后对该资源的任何引用都应使用其中一个URI。那么状态码301和308到底有何区别呢?301类似308永久移动,只不过,301不允许将请求方法从GET更改为POST。
总结
请求转发时注意设置状态码为301或308
301类似308永久移动,只不过,301不允许将请求方法从GET更改为POST
基于以上所述,请求转发推荐使用状态码308
.NET Core如何进行请求转发?的更多相关文章
- Spring MVC 3.0 请求转发和重定向
首先看一下如何获得request对象.session对象: 普通的Controller类,示例代码如下: @Controller @RequestMapping(value = "user& ...
- servlet及jsp之间的请求转发
1.servlet间的请求转发 <dependencies> <dependency> <groupId>javax.servlet</groupId> ...
- 使用Nginx反向代理Docker的Asp.Net Core项目的请求
承接上文的对Kestrel的思考 上一篇介绍了如何一下在docker中发布Asp.Net Core项目(传送门)在最后尝试从外网访问网站的时候发现请求的响应头中包含了这个信息Server:Kestre ...
- JSTL、请求转发和URL重定向
JSTL 为什么要使用JSTL? 因为在JSP中写JAVA代码很麻烦,而JSTL可以简化在JSp中写JAva代码的流程 如何使用JSTL? 准备工作: ①将JSTL依赖的jar包导入工程的WEB-IN ...
- 用 IIS 实现请求转发
最近部门要开发一个简单的APP,部分数据是现有项目已经存在的,为了方便维护,希望只提供一个交互的入口,并且协议的规则不变. 基于这个需求,有两套解决方案: 1.用代码将现有的api封装一层,对请求数据 ...
- Java Web中请求转发和请求包含
1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...
- nginx实现请求转发
反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...
随机推荐
- 神奇的字符串匹配:扩展KMP算法
引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...
- 大话Python类语义
类 物以类聚,人以群分,就是相同特征的人和事物会自动聚集在一起,核心驱动点就是具有相同特征或相类似的特征,我们把具有相同特征或相似特征的事物放在一起,被称为分类,把分类依据的特征称为类属性 计算机中分 ...
- Java知识系统回顾整理01基础06数组04增强型for循环
增强型for循环在遍历一个数组的时候会更加快捷 一.增强型for循环 注:增强型for循环只能用来取值,却不能用来修改数组里的值 public class HelloWorld { public st ...
- C++vector and opencv Mat
转载:https://blog.csdn.net/u012507022/article/details/50979011?utm_source=blogxgwz5 最近在写Opencv程序,用到离散小 ...
- 「剑指offer」27道Mybatis面试题含解析
1.什么是Mybatis? Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement等繁杂 ...
- java安全编码指南之:lock和同步的正确使用
目录 简介 使用private final object来作为lock对象 不要synchronize可被重用的对象 不要sync Object.getClass() 不要sync高级并发对象 不要使 ...
- centos7 安装k8s kubectl 客户端
1. 配置k8s的kubelet 管理客户端 1 cat <<EOF > /etc/yum.repos.d/kubernetes.repo 2 [kubernetes] 3 name ...
- 多测师讲解python练习题_100以内奇数,偶数的和_高级讲师肖sir
(1)通过while 循环来求出1-100之和'''(2)通过while 循环来求出1-100奇数之和'''(3)通过while 循环来求出1-100偶数之和''' 奇数和 sum1=0for i i ...
- 发布MeteoInfo 1.2.4
在JLaTeXMath库(http://forge.scilab.org/index.php/p/jlatexmath/)的支持下,实现了利用LaTeX语法显示特殊符号和数学公式的功能.需要在字符串首 ...
- linux centos 04
1.python的虚拟环境 1.将当前机器上的解释器作为一个 本地,复制出的很多歌 虚拟解释器 物理机上的 本体解释器 ,什么事也不做 分身1: 解释器1:虚拟环境1 运行django 1 ...