当前位置:网站首页>注意.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
边栏推荐
- 使用CopyMemory API出现 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- 商品管理系统——商品新增本地保存实现部分
- SQL语句实现水仙花数求取
- Shoes? Forecasting stock market trends? Taobao second kill? Python means what you want
- Android Development - service application, timer implementation (thread + service)
- 接口测试如何在post请求中传递文件
- Five indispensable open source tools for me
- Ten year itch of programmer
- Dynamo: a typical distributed system analysis
- Impact of libssl on CentOS login
猜你喜欢
Stack & queue (go) of data structure and algorithm series
Mac terminal oh my Zsh + solarized configuration
Using rem, the font size changes when the screen zooms
LTM理解及配置笔记记录
Understanding data structures starts with this article~
走进京东 | 中国空间技术研究院青年创新联盟成员莅临参观京东总部
Reading design patterns adapter patterns
Ten year itch of programmer
微信圈子
SQL statement to achieve the number of daffodils
随机推荐
Reread reconstruction
Analysis of the source code of ThinkPHP facade
Show profile analysis of SQL statement performance overhead
[QT] subclass qthread to realize multithreading
Five indispensable open source tools for me
Wechat circle
再读《重构》
1450. Number of students doing homework at a given time
Android权限大全
Capture bubbles? Is browser a fish?
for与for...in、for Each和map和for of
Impact of libssl on CentOS login
1486. 数组异或操作
Explain Python input() function: get user input string
理解Task和和async await
Program life: from Internet addicts to Microsoft, bat and byte offer harvesters
上周热点回顾(11.2-11.8)
Commodity management system -- integrate warehouse services and obtain warehouse list
Mac terminal oh my Zsh + solarized configuration
基于synchronized锁的深度解析