【问题标题】:Unable to connect to remote SignalR hub in .NET core 3.1无法连接到 .NET core 3.1 中的远程 SignalR 集线器
【发布时间】:2020-08-24 00:27:33
【问题描述】:

我正在尝试托管远程 SignalR 集线器。我创建了一个 .NET core 3.1 web api 应用程序,我的 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 以接受每个来源。在这个项目中,我创建了一个静态 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/negotiate?negotiateVersion=1 并且我收到了 200 回复。 SignalR 在这里工作得很好!

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

现在我创建了第二个 .NET 核心 Web api 项目,该项目也包含一个静态 index.html 文件以及 signalr.js 脚本。然而,这个项目没有托管 SignalRhub,但我正在尝试从我的第一个项目连接到 signalR 集线器。 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 模式下运行这两种解决方案时,我遇到了同样的问题。

【问题讨论】:

标签: .net-core signalr-hub signalr.client asp.net-core-signalr


【解决方案1】:

像这样设置你的 CORS:

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

注意顺序!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多