#asp.net #angular #docker #nginx
#asp.net #angular #docker #nginx
Вопрос:
Я столкнулся с чем-то чрезвычайно странным. У меня есть следующий стек:
- ASP.Net Базовый API 3.1
- Интерфейсное приложение Angular 10
- Прокси-сервер Nginx
Все приложения контейнеризированы, поэтому мой API работает в контейнере docker, мое приложение angular — в контейнере docker (который также использует отдельный веб-сервер nginx для обслуживания SPA) и контейнер nginx, служащий прокси для API.
Ниже приведен типичный запрос GET, который не имеет проблем, и соответствующие заголовки для запроса ПАРАМЕТРОВ:
Итак, запрос GET работает, но когда я пытаюсь использовать POST, запрос параметров выполняется немедленно, за которым следует 400 от nginx вместе с сообщением об ошибке из браузера:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://restaurantapi.localhost/chats. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
Странная часть приведенного выше сообщения об ошибке заключается в том, что запрос ПАРАМЕТРОВ для POST выполнен успешно:
Как возможно, чтобы запрос ПАРАМЕТРОВ был успешно возвращен, но сообщение не удалось? Я не совсем понимаю, как это возможно. Я знаю, что его Nginx вызывает эту проблему, потому что я удалил прокси и отправил запрос непосредственно из моего приложения angular в контейнере в API с использованием веб-сервера kestrel (встроенный веб-сервер для .NET core), и это успешно.
Есть ли какая-либо конфигурация, которую я упускаю из виду, вызывая эту проблему? Обратите внимание, что я добавляю заголовки CORS в свой API и не использую CORS через nginx. Я также попытался удалить заголовки ответов из API в Nginx и явно добавить заголовки CORS, но это все равно не удается. Любая помощь по этому вопросу будет оценена.
Моя конфигурация nginx:
events {
worker_connections 1024;
}
http {
underscores_in_headers on;
upstream api {
server restaurantapi:5001;
}
upstream grpcservice {
server restaurantapi:5010;
}
# redirect all http requests to https
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
server {
server_name restaurantapi.localhost;
listen 443 ssl http2;
ssl_certificate /etc/certs/resapi.crt;
ssl_certificate_key /etc/certs/resapi.key;
location /CartCheckoutService/ValidateCartCheckout {
grpc_pass grpc://grpcservice;
error_page 502 = /error502grpc;
}
location = /error502grpc {
internal;
default_type application/grpc;
add_header grpc-status 14;
add_header grpc-message "Error connecting to gRPC service.";
return 204;
}
location / {
proxy_pass http://api;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Connection keep-alive;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
}
}
gzip on;
gzip_vary on;
gzip_proxied no-cache no-store private expired auth;
gzip_types text/plain text/css application/json application/xml;
}
Журналы из API:
Ответ №1:
Проблема заключалась в наличии заголовков websocket (http://nginx.org/en/docs/http/websocket.html ). Я не совсем уверен, что nginx не регистрирует ошибку подключения к вышестоящему серверу, потому что все отображаемые журналы были запросом к nginx.
Удаление заголовков, специфичных для websocket, устранило проблему, с которой я столкнулся. Мне нужно добавить заголовки только для запросов websocket.