Невозможно подключить клиент SignalR, работающий через порт, к серверу. NET Core 2.2 - PullRequest
1 голос
/ 15 января 2020

У меня есть сервер. 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 позаботится об этом.

Ответы [ 2 ]

1 голос
/ 15 января 2020

Попробуйте вместо этого использовать AddCors и Addpolicy из вашего метода ConfigureServices. Это решило проблему для меня.

В метод ConfigureServices добавьте:

services.AddCors(options =>
        {
            options.AddPolicy("AllowOrigin", builder =>
            builder.WithOrigins(new[] {"http://localhost:5000", "https://localhost:5000"})
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowCredentials()
            .SetIsOriginAllowed((host) => true) //for signalr cors  
            );

А затем сначала в метод Configure добавьте:

app.UseCors("AllowOrigin");
1 голос
/ 15 января 2020

В конце я установил конфигурацию CORS перед всем другим промежуточным программным обеспечением в конвейере (например, AddSignalR), и оно наконец заработало.

public void Configure(IApplicationBuilder app)
{
    app.UseCors(...);

    // Everything else
}
...