ASP.NET Core AWS Serverless и CORS

Я использую 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, что удивительно.

Кроме того, я почти добавил это в свой исходный пост. В статье @sturcotte06 есть подсказка .

Шлюз API (создается автоматически) использует метод ANY в интеграции прокси. В статье выше об этом говорится...

Важно

При применении приведенных выше инструкций к методу ANY в интеграции с прокси любые применимые заголовки CORS не будут установлены. Вместо этого ваш сервер должен возвращать применимые заголовки CORS, такие как Access-Control-Allow-Origin.

Фу! Итак, он говорит, что я должен сделать это на бэкэнде (правда, Startup.cs?), что, похоже, игнорируется при публикации.


person Joe Hakooz    schedule 21.11.2019    source источник
comment
Я не уверен, но разве вся идея без сервера не в том, чтобы не иметь сервера? ELB должен добавлять заголовки CORS, а не ваше приложение. Например, если в вашем проекте есть ядро ​​​​asp.net, это означает, что у вас есть хост, а значит, вы загружены сервером. Вы даже можете увидеть, как IHostingEnvironment появляется в вашем приложении...   -  person sturcotte06    schedule 21.11.2019
comment
VS просто создает кучу лямбда-кода. Каким-то волшебным образом он преобразует довольно сложный C# и просто работает. Я думаю, что добавление заголовков через Startup.cs ничем не отличается.   -  person Joe Hakooz    schedule 21.11.2019
comment
Проверить после удаления AllowCredentials()? Кроме того, добавили ли вы CompatibilityVersion во время вызова AddMvc?   -  person user1672994    schedule 21.11.2019
comment
@ user1672994, я использовал CompatabilityVersion и пробовал несколько вариантов UseCors. Я обновил свой исходный код выше. Спасибо   -  person Joe Hakooz    schedule 21.11.2019
comment
Попробуйте добавить произвольный заголовок в свой контроллер. Я почти уверен, что ответ от лямбды - это объект, а не ответ HTTP. Эластичный балансировщик нагрузки отвечает за отправку HTTP-ответа обратно клиенту. На вашем месте я бы поискал конфигурацию ELB для CORS. (Или облачный фронт или любой другой веб-сервер, обрабатывающий лямбда-трафик)   -  person sturcotte06    schedule 21.11.2019
comment
comment
Спасибо за предложения. Я добавил правку с дополнительной информацией...   -  person Joe Hakooz    schedule 21.11.2019
comment
Разве вам не нужно отображать разрешенные заголовки в шлюзе API? Нажмите на свою конечную точку и проверьте запрос метода и запрос интеграции.   -  person RandomUs1r    schedule 21.11.2019
comment
@RandomUs1r, я так и думал, но посмотри на желтое важное сообщение в моем посте. AWS говорит, что это не сработает для ЛЮБОГО метода, как раз в моем случае.   -  person Joe Hakooz    schedule 21.11.2019
comment
Быстрая проверка работоспособности... Чтобы это работало на локальном хосте, можно обойти любые проблемы, которые могут возникнуть с API-шлюзом, верно? В настоящее время он не работает на локальном хосте, так что, может быть, моя проблема в другом месте? - РЕДАКТИРОВАТЬ поцарапать это. Он работает на локальном хосте.   -  person Joe Hakooz    schedule 21.11.2019
comment
учетные данные + любое происхождение не поддерживается cors.   -  person Daniel A. White    schedule 21.11.2019
comment
@Joe Hakooz Я думаю, вам нужно сделать и то, и другое, вернуть его из своего приложения и установить в качестве заголовка в шлюзе API?   -  person RandomUs1r    schedule 21.11.2019
comment
@RandomUs1r да, это все больше и больше похоже на то, что моя главная проблема - заставить API Gateway добавлять заголовки. Я сейчас глубоко в кроличьей норе.   -  person Joe Hakooz    schedule 21.11.2019


Ответы (1)


По какой-то причине app.UseCors не работает в моем сценарии. Однако app.Use делает...

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

app.UseMvc();
person Joe Hakooz    schedule 21.11.2019