In. Net Core 2.1 Web API для PUT и DELETE только почему «На запрашиваемом ресурсе отсутствует заголовок« Access-Control-Allow-Origin »» - PullRequest
0 голосов
/ 25 апреля 2020

Я использую. NET Core 2.1. Я настроил Startup.cs следующим образом:

public class Startup
{   
     public static IConfiguration Configuration { get; private set; }

     public Startup(IConfiguration configuration)
     {
         Configuration = configuration;
     }


     public void ConfigureServices(IServiceCollection services)
     {
         services.AddCors();
         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
     }

     public void Configure(IApplicationBuilder app, IHostingEnvironment env)
     {
         app.UseCors(builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

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

         app.UseMvc();
     }
 }

Веб-API развернут на linux машине. Методы GET и POST работают нормально. Когда я пытаюсь вызвать PUT или DELETE, это сообщение генерируется в консоли Chroome.

Access to XMLHttpRequest at 'http://IP' from origin 'http://IP' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Изначально Kestrel включался в список 50001, поскольку присутствовал сертификат SSL. Я настроил Kestrel в appsettings.json для прослушивания только на 5000. Так что теперь его единственный список 5000.

appsettings. json

{
    "Kestrel": {
        "EndPoints": {
            "Http": {
                "Url": "http://localhost:5000"
            }
        }
    }
}

Я попробовал почти все ответы, приведенные в этой теме Как включить CORS в ASP. net Core WebAPI

Ни один из них не работал в моем случае.

Origin - мой локальный хост, а веб-API работает на Live IP.

РЕДАКТИРОВАТЬ 1

Preflight (OPTIONS) Заголовки ответа

HTTP/1.1 204 No Content
Server: nginx/1.14.0 (Ubuntu)
Date: Sat, 25 Apr 2020 18:50:50 GMT
Connection: keep-alive
Access-Control-Allow-Headers: authtoken,authuser,content-type
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Origin: *

Предпечатная проверка (ОПЦИИ) Заголовки запроса

OPTIONS /Foo/Controller HTTP/1.1
Host: MY LINUX Machine Live IP
Connection: keep-alive
Access-Control-Request-Method: PUT
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Access-Control-Request-Headers: authtoken,authuser,content-type
Accept: */*
Referer: http://localhost:8080/xyz
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9

Фактический запрос (Заголовки запроса)

PUT /Foo/Controller HTTP/1.1
Host: Linux IP
Connection: keep-alive
Content-Length: 63
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Content-Type: application/json
Referer: http://localhost:8080/xyz
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9

Фактический запрос (заголовки ответа)

HTTP/1.1 500 Internal Server Error
Content-Type: text/html
Content-Length: 225
Connection: Close

1 Ответ

0 голосов
/ 25 апреля 2020

С указанными c сбоями при вызовах PUT и DELETE кажется, что у вас все еще возникают проблемы с запросами предварительной проверки

за https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.1#preflight -requests-1 :

Предварительные запросы Для некоторых запросов CORS браузер отправляет дополнительный запрос перед выполнением фактического запроса. Этот запрос называется предполетным запросом. Браузер может пропустить предварительный запрос, если выполняются следующие условия:

  • Метод запроса: GET, HEAD или POST.
  • Приложение не устанавливает заголовки запросов, кроме Accept, Accept-Language, Content-Language, Content-Type или Last-Event-ID.
  • Заголовок Content-Type, если set, имеет одно из следующих значений:
    • application / x- www-form-urlencoded
    • multipart / form-data
    • text / plain

Трудно решить конкретные проблемы с тем, что у вас есть выше, не зная, существует ли что-то вроде nginx или какой-либо другой обратный прокси-сервер между Kestrel и сетью, который может влиять на заголовки. Во время тестирования эта статья от Рика Страла также представляет хорошее напоминание во время локального тестирования или тестирования без перекрестного источника:

https://weblog.west-wind.com/posts/2016/sep/26/aspnet-core-and-cors-gotchas#Watch -out-for-for-для проверки-CORS-без-Cross-Domain !

Заголовки CORS отправляются только для междоменных запросов, и модуль ASP.NET CORS достаточно умен, чтобы определить, запускается ли тот же запрос домена, и если он есть, не отправляет заголовки .

Проверяя эту ошибку в Chrome, убедитесь, что вы можете взглянуть на сделанные вызовы и подтвердить, что все предварительные вызовы OPTIONS содержат искомые заголовки. Эта ссылка на StackOverflow описывает включение отображения запросов OPTIONS при отладке:

{ ссылка }

...