当前位置:网站首页>注意.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
边栏推荐
- Fedora 33 Workstation 的新功能
- Gather in Beijing! Openi / O 2020 Qizhi Developer Conference enters countdown
- Method of creating flat panel simulator by Android studio
- range_sensor_layer
- 搭建全分布式集群全过程
- 日志分析工具 - GoAccess
- 走进京东 | 中国空间技术研究院青年创新联盟成员莅临参观京东总部
- As a user, you can't get rid of the portrait!
- 十五年后,重构一个“在线的腾讯”
- SQL statement to achieve the number of daffodils
猜你喜欢

Commodity management system -- implementation of local preservation of new commodities

Understanding runloop in OC

List of wechat video Number broadcasters October 2020

解决IDEA快捷键 Alt+Insert 失效的问题

程序人生|从网瘾少年到微软、BAT、字节offer收割机逆袭之路

百亿级数据分表后怎么分页查询?

Mac 终端(terminal) oh-my-zsh+solarized配置

Commodity management system -- integrate warehouse services and obtain warehouse list

After SQL group query, get the first n records of each group

彩虹排序 | 荷兰旗问题
随机推荐
AI应届生年薪涨到40万了,你现在转行还来得及!
Explain Python input() function: get user input string
After SQL group query, get the first n records of each group
财富自由梦缓?蚂蚁金服暂停上市,监管后估值或下跌
基于synchronized锁的深度解析
十五年后,重构一个“在线的腾讯”
商品管理系统——商品新增本地保存实现部分
再读《重构》
Elasticsearch原理解析与性能调优
Log analysis tool - goaccess
An attempt to read or write to protected memory occurred using the CopyMemory API. This usually indicates that other memory is corrupted.
大型项目Objective-C - NSURLSession接入短信验证码应用实例分享
手写Koa.js源码
GLSB涉及负载均衡算法
Understanding task and async await
接口测试如何在post请求中传递文件
一个简单的能力,决定你是否会学习!
配置交换机Trunk接口流量本地优先转发(集群/堆叠)
Biden wins the US election! Python developers in Silicon Valley make fun of Ku Wang in this way
Recommended tools for Mac