У меня есть сервер. NET Core 2.2, работающий локально на http://localhost:5002
, и клиент (в основном, копия / вставка из документов Microsoft ), работающий на http://localhost:5000
.
Вкл. на стороне сервера у меня есть образец концентратора из документов, только что переименованный в TestHub
, и следующие биты в Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSignalR(options => { options.EnableDetailedErrors = true; });
services.AddCors();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app)
{
...
app.UsePathBase("/custom");
app.UseSignalR(routes =>
{
routes.MapHub<TestHub>("/test");
});
app.UseCors(options => options
.AllowAnyHeader()
.AllowAnyMethod()
.WithOrigins("http://localhost:5000")
.AllowCredentials());
app.UseMvc();
}
Конфигурация CORS была адаптирована из этой проблемы GitHub .
На стороне клиента я установил пакет @microsoft/signalr
, используя инструкции из документации, затем слегка изменил файл chat.js
, чтобы использовать URL-адрес сервера.
"use strict";
// This is the only line I changed
var connection = new signalR.HubConnectionBuilder().withUrl("http://localhost:5002/test").build();
//Disable send button until connection is established
document.getElementById("sendButton").disabled = true;
connection.on("ReceiveMessage", function (user, message) {
...
});
connection.start().then(function () {
document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
return console.error(err.toString());
});
document.getElementById("sendButton").addEventListener("click", function (event) {
...
});
Я пробовал оба http://localhost:5002/test
и http://localhost:5002/custom/test
, но ничего не работает. Chrome просто говорит net::ERR_FAILED
, тогда как Firefox сообщает 405
ответ на OPTIONS
вызов http://localhost:5002/test/negotiate?negotiateVersion=1
. Однако оба браузера предупреждают, что заголовок Access-Control-Allow-Origin
отсутствует, что странно, поскольку я ожидал, что конфигурация CORS позаботится об этом.