无法连接到远程SignalR集线器在.NET core 3.1中。

问题描述 投票:1回答:1

我试图托管一个远程SignalR集线器,我创建了一个.NET core 3.1的web api应用程序,在我的Startup类中有以下代码。我创建了一个.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:5001myHubnegotiate?negotiateVersion=1。 而我却得到了200的回复。SignalR在这里很好用

当我使用postman或其他REST客户端,发布到 https:/localhost:5001myHubnegotiate?negotiateVersion=1。它工作得很好,我得到了一个响应。

现在我创建了第二个.NET core web api项目,也包含一个静态index.html文件,以及signalr.js脚本。然而,这个项目并没有托管SignalRhub,但我试图从第一个项目连接到signalR hub。index.html是我第一个项目的html的副本,但是有一个连接字符串到我第一个项目的signalR hub。它看起来是这样的。

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中心。在开发者工具中,我得到了一个"(失败)net::ERR_FAILED "的状态返回,没有任何其他信息。

上面的例子是使用SSL(https)。另外,当在http模式下运行两个解决方案时,我遇到了同样的问题。

.net-core signalr-hub signalr.client asp.net-core-signalr
1个回答
1
投票

像这样设置你的CORS。

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

请注意,顺序!

© www.soinside.com 2019 - 2024. All rights reserved.