在 Google App Engine 柔性环境中启用 CORS

Posted

技术标签:

【中文标题】在 Google App Engine 柔性环境中启用 CORS【英文标题】:Enabling CORS in Google App Engine Flexible Environment 【发布时间】:2019-04-24 12:54:27 【问题描述】:

我在为使用 Google App Engine 和柔性环境托管的 ASP.NET CORE 应用程序启用 CORS 支持时遇到问题。

使用 axios 库的每个 AJAX 请求都会导致以下错误...

在“https://api.[something].services/request”访问 XMLHttpRequest 来自原点“http://localhost:8080”已被 CORS 策略阻止: 请求中不存在“Access-Control-Allow-Origin”标头 资源。

这里是web api上CORS的配置:

public void ConfigureServices(IServiceCollection services)

    services.AddCors(options => 
    options.AddPolicy("MyPolicy", 
        builder =>
        
            builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials();
        ));

   // ...

   services.AddMvc();


public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();

        System.Environment
              .SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS",
                          Path.Combine(Directory.GetCurrentDirectory(),
                          Configuration["GAE:Credentials"]));
    
    else
    
        app.UseHsts();
    

    // ...

    app.UseCors("MyPolicy");
    app.UseHttpsRedirection();
    app.UseMvc();

【问题讨论】:

响应的 HTTP 状态码是什么? 确保 app.UseCors("MyPolicy") 位于您定义的任何 API 端点之前(即,如果 // ... 部分定义了任何端点,请将 UseCors 移到其上方)。如果您将EnableCors 属性添加到特定控制器或操作,还可以查看结果是否发生变化。 【参考方案1】:

这种类型的 CORS 错误通常是在资源 1 向另一个资源 2 进行跨域 HTTP 请求而资源 2 的处理程序返回包含值 http://resource1 的响应标头时获得的。

考虑到这一点,http header handler 配置需要在 App Engine 中部署的应用程序 App.yaml 文件中进行适当设置。大多数浏览器使用 XMLHttpRequest 对象进行跨域请求,负责插入正确的标头并处理与服务器的 CORS 交互。

以上所有这些信息都适用于 App Engine Standard,而不是 App Engine Flex 环境。那是因为CORS requests are disallowed by default on App Engine Flex。不过you can allow CORS request by adding this "x-google-endpoints" to your API configuration documentation.

【讨论】:

您提供的有关 App Engine Flex 的链接特定于可扩展服务代理 (ESP),并且仅当问题是/特定于 ESP 时才相关。 GAE flex 本身默认不阻塞CORS,跨域请求不需要修改app.yaml。

以上是关于在 Google App Engine 柔性环境中启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章

App Engine Python 柔性环境选择运行时

有没有办法在 Google App Engine 中部署面向内部的应用程序?

Google App Engine .Net Core 2.0 应用无法访问 Google Cloud SQL 数据库

如何在 Google App Engine 标准环境中使用 Google Cloud Build 或其他方法设置环境变量?

Google Cloud App Engine:如何在灵活的环境中提供 https

在Google App Engine Standard中配置嵌套的静态文件夹 - PHP环境