Невозможно подключиться к удаленному концентратору SignalR в. NET core 3.1 - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь разместить удаленный концентратор SignalR. Я создал веб-приложение api. NET core 3.1, в котором у меня есть следующий код в моем классе Startup.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

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

    services.AddSignalR();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();
    app.UseStaticFiles();

    app.UseCors("CorsPolicy");

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapHub<KappHub>("/myHub");
    });
}

CORS должен быть включен, чтобы принимать все источники. В этом проекте я создал файл stati c index. html.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <h1>Kapp Folc Local Tester</h1>
    <script src="js/signalr/dist/browser/signalr.js"></script>
    <script>
        var connection = new signalR.HubConnectionBuilder().withUrl("/myHub").build();

        connection.start().then(function () {
            console.log('OK');
        }).catch(function (err) {
            console.log(err);
        });
    </script>
</body>
</html>

Это отлично работает! когда я погружаюсь в инструменты разработчика, я вижу, что моя веб-страница отправляется по адресу https://localhost: 5001 / myHub /gotiate ?gotiateVersion = 1 , и я получаю ответ 200. SignalR здесь отлично работает!

Когда я использую почтальон или любой другой клиент REST для отправки на https://localhost: 5001 / myHub /gotiate ?gotiateVersion = 1 , он работает нормально, и я получаю ответ.

Теперь я создаю второй проект. NET core web api, который также содержит файл stati c index. html вместе со скриптом signalr. js. Однако в этом проекте не размещается SignalRhub, но вместо этого я пытаюсь подключиться к концентратору signalR из моего первого проекта. Индекс. html является точной копией html из моего первого проекта, но со строкой подключения к концентратору signalR из моего первого проекта. Это выглядит так:

var connection = new signalR.HubConnectionBuilder().withUrl("https://localhost:5101/myHub").build();

Запуск в моем втором проекте выглядит так:

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();
    app.UseStaticFiles();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Когда я запускаю этот проект, я перехожу к индексу. html из моего Во втором проекте он не может подключиться к концентратору signalR из моего первого проекта. В инструментах разработчика я получаю статус «(сбой) net :: ERR_FAILED» без какой-либо другой информации.

В приведенных выше примерах используется SSL (https). Также при запуске обоих решений в режиме http возникает та же проблема.

1 Ответ

1 голос
/ 10 мая 2020

Установите свой CORS следующим образом:

services.AddCors(options => options.AddPolicy("CorsPolicy",
                   builder =>
                   {
                       builder
                           .WithOrigins("https://localhost:44339/")
                           .AllowAnyHeader()
                           .AllowAnyMethod()
                           .AllowCredentials()
                           .SetIsOriginAllowed((host) => true);
    }));

Обратите внимание, что порядок!

...