当前位置:网站首页>注意.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
边栏推荐
猜你喜欢
程序员的十年之痒
Front end code style practice prettier + eslint + git hook + lint staged
Interview summary on November 7, 2020 (interview 12K)
从编码、网络传输、架构设计揭秘腾讯云高质量、高可用实时音视频技术实践...
Composition - API
How to ensure that messages are not consumed repeatedly? (how to ensure the idempotent of message consumption)
Handwriting Koa.js Source code
彩虹排序 | 荷兰旗问题
外贸自建网站域名的选择— Namesilo 域名购买
【QT】子类化QThread实现多线程
随机推荐
EFF 认为 RIAA 正在“滥用 DMCA”来关闭 YouTube-DL
开源ERP招聘了
开源 | HMGNN:异构小图神经网络及其在拉新裂变风控场景的应用
[design pattern] Chapter 4: Builder mode is not so difficult
日志分析工具 - GoAccess
Deng Junhui's notes on data structure and algorithm learning - Chapter 9
Wealth and freedom? Ant financial services suspended listing, valuation or decline after regulation
Elasticsearch原理解析与性能调优
Python zero basics tutorial (01)
如何保证消息不被重复消费?(如何保证消息消费的幂等性)
How to ensure that messages are not consumed repeatedly? (how to ensure the idempotent of message consumption)
Mac terminal oh my Zsh + solarized configuration
inet_pton()和inet_ntop()函数详解
Looking for better dynamic getter and setter solutions
安卓开发——服务应用,计时器的实现(线程+服务)
SQL Chapter 2 Chapter 3
Recommendation system, in-depth paper analysis gbdt + LR
for与for...in、for Each和map和for of
Aren't you curious about how the CPU performs tasks?
Impact of libssl on CentOS login