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的主要内容,如果未能解决你的问题,请参考以下文章