在我的基础架构中,我使用 SSL 卸载,以便来自使用 Https 的公共(public)互联网的每个请求都进行负载平衡并卸载到发送到所需内部服务器的 Http 请求。 将 OData 用于 .net Core 我需要告诉框架,当生成新链接时,对于分页、流、元数据等,如果传入请求装饰有标题“X-Forwarded-Proto”,则这些链接必须是 Https ".
例如,在获取数据时,我收到如下有效负载:
{
"@odata.context": "http://host/Api/$metadata#Entities",
"value": [
...
],
"@odata.nextLink": "http://host/Api/Entities?$skiptoken=Language-'-',ID-1"
}
但我希望这样:
{
"@odata.context": "https://host/Api/$metadata#Entities",
"value": [
...
],
"@odata.nextLink": "https://host/Api/Entities?$skiptoken=Language-'-',ID-1"
}
最佳答案
在查看 OData 源代码后,我可以非常确定地确认没有任何功能可以开箱即用。 似乎也不可能覆盖现有类的行为。
所以我想到的替代解决方案是:
- 使用中间件拦截请求并替换模式
- 拦截响应并解析替换元数据链接的内容
我决定采用选项 1,以下是我采用的解决方案。
// Middleware used to simulate an https request when behing a load balancer with SSL offloade
app.Use(async (context, next) =>
{
if (context.Request.Headers.ContainsKey("X-Forwarded-Proto"))
{
// The request schema is used by OData to generate all links like, Metadata, Next, GetById and so on
context.Request.Scheme = "https";
}
await next();
});
这适用于所有元数据链接,您可以验证它,发送带有 Accept Header 且值为 'application/json;odata.metadata=full' 的请求. 第二种选择容易出错且占用大量 CPU,但如果用于其他目的,我的解决方案可能会中断您的请求。
关于c# - OData .net Core 使用 SSL 卸载时如何在每个链接中设置 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59267027/