无法连接到 .NET Core 3.1 中的远程 SignalR 集线器

Unable to connect to remote SignalR hub in .NET core 3.1

我正在尝试托管远程 SignalR 集线器。我创建了一个 .NET core 3.1 web api 应用程序,其中我的 Startup class.

中包含以下代码
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 以接受每个来源。在这个项目中,我创建了一个静态 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>

这很好用!当我深入研究开发人员工具时,我可以看到我的网页 post 正在 https://localhost:5001/myHub/negotiate?negotiateVersion=1 并且我收到了 200 条回复。 SignalR 在这里工作得很好!

当我使用 postman 或任何其他 REST 客户端时,从 post 到 https://localhost:5001/myHub/negotiate?negotiateVersion=1,它工作正常并且我得到了响应。

现在我创建第二个 .NET 核心 Web api 项目,还包含一个静态 index.html 文件和 signalr.js 脚本。然而,这个项目没有托管 SignalRhub,但我正在尝试从我的第一个项目连接到 signalR hub。 index.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();
    });
}

当我 运行 这个项目并从我的第二个项目导航到 index.html 时,它无法从我的第一个项目连接到 signalR 集线器。在开发人员工具中,我得到一个“(failed)net::ERR_FAILED”状态,没有任何其他信息。

以上示例使用的是 SSL (https)。此外,当 运行在 http 模式下使用这两种解决方案时,我遇到了同样的问题。

像这样设置您的 CORS:

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

注意顺序!