博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
注意.NET Core进行请求转发问题
阅读量:4033 次
发布时间:2019-05-24

本文共 2065 字,大约阅读时间需要 6 分钟。

【导读】近日,有关注我公众号的小伙伴私信我,遇到一个问题搞了很久没解决,此问题具有参考意义,这里跟大家分享下,希望对你能有所帮助

内网环境跟外网隔离,现在外网的请求都需要一个专用服务器转接到内网处理,用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

转载地址:http://nvkdi.baihongyu.com/

你可能感兴趣的文章
socket编程中select的使用
查看>>
C++获取文件大小常用技巧分享
查看>>
未来5年大机遇:做贩卖多巴胺的超级玩家
查看>>
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
第一性原理:戳中问题本质的人是怎么思考的?
查看>>
No.147 - LeetCode1108
查看>>
No.148 - LeetCode771
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>