SignalR не работает на IIS (ошибка выпуска CORS 405) - PullRequest
1 голос
/ 31 октября 2019

Я разработал и Angular AspNetCore приложение. В моей среде разработки все работает отлично. Я могу установить концентраторное соединение с signalR и использовать его без каких-либо проблем. Однако при публикации в IIS (10.0) я получаю следующую ошибку:

Access to XMLHttpRequest at 'http://localhost:5000/chart/negotiate' from origin 'http://localhost:8034' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

На стороне сервера в Startup.cs мой метод configure services содержит этот фрагмент кода:

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

и в методе Configure определяет маршрут сигнализатора

            app.UseSignalR(routes =>
            {
                routes.MapHub<MessageHub>("/chart");
            });

и добавляет политику cors

app.UseCors("CorsPolicy");

Я пытался:

  • Переключение на разные порты

  • Изменение URL-адреса моего концентраторного соединения на порт, на котором я развернул свой IIS-сервер (8034)

Это приводит к этой ошибке:

WebSocket connection to 'ws://localhost:8034/chart?id=vzjCtGG-Glo_8i-1j7oFDA' failed: Error during WebSocket handshake: Incorrect 'Sec-WebSocket-Accept' header value
  • Включение Https

  • Изменение AllowAllOrigin на WithOrigin ("http://localhost:8034", ... )

  • Добавление протоколов Http в web.config

      <httpProtocol>
          <customHeaders>
            <add name="Access-Control-Allow-Origin" value="http://localhost" />
            <add name="Access-Control-Allow-Methods" value="*" />
            <add name="Access-Control-Allow-Credentials" value="true" />
          </customHeaders>
        </httpProtocol>

Локально работает как шарм:

Общие

Request URL: http://localhost:5000/chart/negotiate
Request Method: POST
Status Code: 200 OK
Remote Address: 127.0.0.1:5000
Referrer Policy: no-referrer-when-downgrade

** Заголовки ответа **

Content-Length: 252
Content-Type: application/json
Date: Thu, 31 Oct 2019 01:51:05 GMT
Server: Kestrel
X-Powered-By: ASP.NET
X-SourceFiles: =?UTF-8?B?QzpcQmFzZW1lbnRMYW5BcHBcQmFzZW1lbnRMYW5BcHBcY2hhcnRcbmVnb3RpYXRl?=

Заголовки запроса

Provisional headers are shown
Content-Type: text/plain;charset=UTF-8
Origin: http://localhost:5000
Referer: http://localhost:5000/
Sec-Fetch-Mode: cors
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36
X-Requested-With: XMLHttpRequest

При публикации в IIS напорт 8034 не работает.

General:

Request URL: http://localhost:5000/chart/negotiate
Request Method: OPTIONS
Status Code: 405 Method Not Allowed
Remote Address: 127.0.0.1:5000
Referrer Policy: no-referrer-when-downgrade

Заголовки ответа:

Content-Length: 0
Content-Type: text/plain
Date: Thu, 31 Oct 2019 01:28:35 GMT
Server: Kestrel
X-Powered-By: ASP.NET
X-SourceFiles: =?UTF-8?B?QzpcQmFzZW1lbnRMYW5BcHBcQmFzZW1lbnRMYW5BcHBcY2hhcnRcbmVnb3RpYXRl?=

Заголовки запроса:

Provisional headers are shown
Access-Control-Request-Headers: x-requested-with
Access-Control-Request-Method: POST
Origin: http://localhost:8034
Referer: http://localhost:8034/
Sec-Fetch-Mode: cors
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36

Это мои настройки запуска:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5000/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "ChartApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000/"
    }
  }
}

Я не понимаю, почему я получаю это исключение 405 в моей опубликованной среде. Я разрешаю запросы от всех источников, поэтому я ожидаю, что заголовок ответа будет содержать «Access-Control-Allow-Credentials» = «true».

Что мне не хватает?

...