c# - OData .net Core 使用 SSL 卸载时如何在每个链接中设置 HTTPS

标签 c# ssl asp.net-core odata

在我的基础架构中,我使用 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. 使用中间件拦截请求并替换模式
  2. 拦截响应并解析替换元数据链接的内容

我决定采用选项 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/

相关文章:

c# - 在运行其余方法之前更新 UI

linux - 由于 TLS 错误,无法进行 svn checkout

c# - 同步使用 nice .net 4.5 HttpClient 的最佳方式

security - Https - 互联网断开后 token 失效?

android - SSL:- 以编程方式验证服务器证书的到期日期 Android

angular - @Types/node/index.d.ts TypeScript 错误 TS2309

asp.net - 使用 ASP.NET Core 将 PDF 返回到浏览器

asp.net-core - 使用 Angular 6 ag-grid 和 ASP.NET 以及 EF Core 2.1 进行服务器端过滤

c# - 在 hololens 应用程序中将图像保存到照片文件夹

c# - 您如何将 Excel 工作表复制到新工作簿中并带来所有图表、图像等?