ASP.NET Core AWS 无服务器和 CORS

Posted

技术标签:

【中文标题】ASP.NET Core AWS 无服务器和 CORS【英文标题】:ASP.NET Core AWS Serverless and CORS 【发布时间】:2020-03-17 17:40:50 【问题描述】:

我正在使用 Visual Studio 将 ASP.NET Core 2.1 应用程序发布到 AWS Lambda(无服务器)。无论我尝试了什么,我都无法让 CORS 工作。

我真正想做的就是将标题access-control-allow-origin 全局添加到我的网络应用程序中。

有没有人成功地将标头添加到 ASP.NET Core 2.1 无服务器应用程序?

Startup.cs

public void ConfigureServices(IServiceCollection services)

    // AddCors must be before AddMvc
    services.AddCors();

    services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
    );


public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    // UseCors must be before UseMvc
    app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials()
    );
    // Also tried this
    // app.UseCors(
    //    o => o.WithOrigins("http://example.com").AllowAnyMethod()
    //);

    app.UseMvc();

没有向我的页面添加 CORS 标头。我正在使用 Chrome 开发工具来检查我的标题。我应该在主页上看到它们(例如)正确吗?

有什么想法吗?我快死在这里了。谢谢!

编辑

此应用程序仅使用 API Gateway、Lambda 和其他一些服务。这很棒,因为只有当有人点击我的应用程序时才会向我收费。没有按小时收费。没有令人惊叹的 EC2 或 ELB。

另外,我几乎把这个添加到我原来的帖子中。 article @sturcotte06 引用有一个陷阱。

API 网关(自动生成)在代理集成中使用 ANY 方法。上面的文章是这么说的……

重要

将上述说明应用于代理集成中的 ANY 方法时,将不会设置任何适用的 CORS 标头。相反,您的后端必须返回适用的 CORS 标头,例如 Access-Control-Allow-Origin。

啊!所以它说我必须在后端执行此操作(Startup.cs 对吗?),这正是发布时似乎被忽略的内容。

【问题讨论】:

我不确定,但无服务器的整个想法不就是没有服务器吗? ELB 应该添加 CORS 标头,而不是您的应用程序。就像,如果你的项目中有 asp.net 核心,这意味着你有一个主机,这意味着你是服务器的。您甚至可以看到 IHostingEnvironment 出现在您的应用中... VS 只是创建了一堆 Lambda 代码。不知何故,它神奇地转换了相当复杂的 C# 并且它可以正常工作。我认为通过 Startup.cs 添加标头应该没有什么不同。 删除AllowCredentials()后检查?另外,您在AddMvc 通话期间添加了CompatibilityVersion 吗? @user1672994,我一直在使用 CompatabilityVersion 并尝试了 UseCors 的几种变体。我在上面更新了我的源代码。谢谢 尝试在控制器中添加任意标题。我很确定来自 lambda 的响应是一个对象,而不是 HTTP 响应。弹性负载均衡器负责将 HTTP 响应发送回客户端。如果我是你,我会寻找 CORS 的 ELB 配置。 (或云端或任何处理 lambda 流量的 Web 服务器) 【参考方案1】:

无论出于何种原因 app.UseCors 在我的场景中都不起作用。但是,app.Use 确实...

app.Use((context, next) =>

    context.Response.Headers["Access-Control-Allow-Origin"] = "https://example.com";
    return next.Invoke();
);

app.UseMvc();

【讨论】:

以上是关于ASP.NET Core AWS 无服务器和 CORS的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET (Core 2) Web 应用程序中访问来自 AWS 的认证?

ASP.NET Core AWS Cognito JWT

AWS负载均衡器后面的ASP.NET Core 2.1 HTTPS重定向?

打包 SF 无状态 ASP.NET Core Web 应用程序后缺少代码

AWS ASP.NET Core 2.1 和带角度的 CORS

将 asp.net core web api 部署到 aws elastic beanstalk 时出现错误 404