当前位置:网站首页>注意.NET Core进行请求转发问题
注意.NET Core进行请求转发问题
2020-11-09 11:37:00 【osc_4otxquc2】
【导读】近日,有关注我公众号的小伙伴私信我,遇到一个问题搞了很久没解决,此问题具有参考意义,这里跟大家分享下,希望对你能有所帮助
内网环境跟外网隔离,现在外网的请求都需要一个专用服务器转接到内网处理,用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);
}
然后我们一运行,发现结果都没转发到对应内网应用程序,这是为何呢?
状态码(308)设置
事实上,转发请求涉及到资源重分配指向另一URL问题,当然我们需要注意的是,既然是转发请求,势必转发者和接受者请求方式必须一致,要不然肯定不行。所以我们必须显式指定重定向状态码,设置为308,如下:


针对状态码308的意思,我们可以参看.NET Core中对于状态码枚举解释:永久重定向,原始请求方式和目标请求方式必须一致,支持原始请求和目标请求同为GET或POST。
.NET Core中关于此状态码的解释并不那么详细,我们来到专对状态码官方解释(https://httpstatuses.com/308),这里我贴下谷歌翻译后的中文
308永久重定向:已为目标资源分配了一个新的永久URI,以后对该资源的任何引用都应使用其中一个URI。
具有链接编辑功能的客户端应在可能的情况下自动将对有效请求URI的引用重新链接到服务器发送的一个或多个新引用。
服务器应在响应中生成一个Location头字段,其中包含新的永久URI的首选URI引用。用户代理可以使用位置字段值进行自动重定向。服务器的响应有效负载通常包含简短的超文本注释,其中包含指向新URI的超链接。
默认情况下,308响应可缓存;即,除非方法定义或显式缓存控制
状态码(301)设置
我们也可以指定响应状态码为301,
response.StatusCode = 301;
当然此时内网接收程序必须改为GET,如下:

301永久移动:已为目标资源分配了一个新的永久URI,以后对该资源的任何引用都应使用其中一个URI。
那么状态码301和308到底有何区别呢?301类似308永久移动,只不过,301不允许将请求方法从GET更改为POST
???? 请求转发时注意设置状态码为301或308
???? 301类似308永久移动,只不过,301不允许将请求方法从GET更改为POST
???? 基于以上所述,请求转发推荐使用状态码308
版权声明
本文为[osc_4otxquc2]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4394291/blog/4709081
边栏推荐
- Three ways to operate tables in Apache iceberg
- 1450. 在既定时间做作业的学生人数
- Stack & queue (go) of data structure and algorithm series
- libssl对CentOS登录的影响
- GLSB涉及负载均衡算法
- 理解Task和和async await
- AI fresh student's annual salary has increased to 400000, you can still make a career change now!
- Review of hot spots of last week (11.2-11.8)
- Reread reconstruction
- 十五年后,重构一个“在线的腾讯”
猜你喜欢

Front end code style practice prettier + eslint + git hook + lint staged

典型分布式系统分析:Dynamo
![[Python from zero to one] 5. Detailed explanation of beautiful soup basic syntax of web crawler](/img/e8/dd70ddf3c2027907f64674676d676e.jpg)
[Python from zero to one] 5. Detailed explanation of beautiful soup basic syntax of web crawler

Biden wins the US election! Python developers in Silicon Valley make fun of Ku Wang in this way

解决python调用 ffmpeg时 ‘ffmpeg‘ 不是内部或外部命令,也不是可运行的程序

手写Koa.js源码

从实践谈 Ruby 语法上的几个设计不一致带来的问题。

SQL statement to achieve the number of daffodils

Learning notes of nodejs

Python zero basics tutorial (01)
随机推荐
解决IDEA快捷键 Alt+Insert 失效的问题
理解 OC 中 RunLoop
AI应届生年薪涨到40万了,你现在转行还来得及!
搭建全分布式集群全过程
日志分析工具 - GoAccess
Capture bubbles? Is browser a fish?
Impact of libssl on CentOS login
Show profile analysis of SQL statement performance overhead
Android 复选框 以及回显
外贸自建网站域名的选择— Namesilo 域名购买
El table dynamic header
推荐系统,深度论文剖析GBDT+LR
“微服务”技术另一个可能更合适的名字
Chrome浏览器引擎 Blink & V8
零基础IM开发入门(四):什么是IM系统的消息时序一致性?
Wealth and freedom? Ant financial services suspended listing, valuation or decline after regulation
range_sensor_layer
安全(杂记)
捕获冒泡?难道浏览器是鱼吗?
未来中国电信将把云计算服务打造成为中国电信的主业