Я разработал и 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».
Что мне не хватает?