Установка CORS в Azure Функции, выполняющиеся внутри контейнера docker - PullRequest
0 голосов
/ 08 июля 2020

Я создал функцию azure, которая предоставляет API, который используется в другом проекте. Я хотел бы позволить команде, которая работает над интерфейсом, иметь изображение Docker нашего API, чтобы помочь им в их разработке. Я упаковал свою функцию azure, используя файл Dockerfile, который создается при запуске func init LocalFunctionsProject --worker-runtime dotnet --docker согласно этого руководства

Это приводит к следующему содержимому файла Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS installer-env

COPY . /src/dotnet-function-app
RUN cd /src/dotnet-function-app && \
    mkdir -p /home/site/wwwroot && \
    dotnet publish *.csproj --output /home/site/wwwroot

FROM mcr.microsoft.com/azure-functions/dotnet:2.0
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
    AzureFunctionsJobHost__Logging__Console__IsEnabled=true


COPY --from=installer-env ["/home/site/wwwroot", "/home/site/wwwroot"]

Затем я создал файл docker-compose.yml в проекте внешнего интерфейса:

version: "3.7"
services:
  frontend:
    image: frontend:latest
    build: .  
    ports: 
      - "3000:3000"  
    env_file: 
      - frontend.docker.env
  backend: 
    image: backend:latest
    env_file:
      - backend.docker.env
    ports: 
      - "8080:80"   

Это успешно раскручивает два контейнера: один с внешним интерфейсом, а другой с серверной частью. Внутри моего frontend.docker.env я установил свою переменную так, чтобы она указывала на backend, чтобы вызовы из внешнего интерфейса были направлены на http://backend/api/myendpoint Однако именно здесь все не работает, я получаю проблему CORS:

То, что я пробовал :

  1. Каждый раз, когда я вызываю свой бэкэнд с открытого порта 8080 из Postman, все работает нормально. Я попытался вручную добавить заголовок Access-Control-Allow-Origin со значением * в свой ответ, который, как я могу проверить, поступает в Postman. Однако передняя часть по-прежнему сталкивается с проблемой CORS.

Запрос на кросс-источник заблокирован: та же политика происхождения запрещает чтение удаленного ресурса по адресу http://backend/api/myendpoint. (Причина: запрос CORS не выполнен)

Мой другой подход - изменить web.config внутри файла azure-functions-host вручную, выполнив следующую инструкцию в моем Dockerfile:

RUN sed -i 's/<customHeaders>/<customHeaders><add name="Access-Control-Allow-Origin" value="*" \/><add name="Access-Control-Allow-Headers" value="Content-Type" \/><add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" \/>/g' azure-functions-host/web.config

После этого я вижу следующие заголовки, поступающие из ответа в Postman:

Access-Control-Allow-Headers = X-Requested-With, content-type

Access-Control-Allow-Methods = GET, POST, OPTIONS, PUT, PATCH, DELETE

Access-Control-Allow-Origin = *

Однако я все еще сталкиваюсь с той же проблемой. Почтальон работает, интерфейс не работает ... Вы хоть представляете, в чем может быть проблема или как правильно установить CORS

...