首页 > 解决方案 > 将项目移动到新 PC 后,Docker 中 .NET Core 2.1 的 SignalR 无法正常工作

问题描述

更新:已解决(请阅读下文)

我在 PC1 上创建了这个项目。当我找到 SignalR 时,我已经研究了一段时间。在实现并让 SignalR 工作之后,我不得不移动到新 PC,因此我保存了项目文件夹并将其移动到新 PC。我安装了 Docker for Windows、.NET Core 2.1 SDK 和 VS。我将项目放在同一个文件夹中(C:\users\xxx\source\repos)。现在,当我运行它时,它按预期工作,但客户端(浏览器)不会对来自服务器的 SignalR 调用做出反应。因为我没有从客户端调用函数,所以我没有使用自定义集线器。

我的问题是:一旦我尝试从 JS 建立到服务器的 SignalR 连接,它就会在 JS-Console 中告诉我找不到匹配的构造函数。使用 中的断点查看集线器对象时AddMessage(),它不为空,因此某种构造函数正在工作。

我不知道该怎么做。

错误信息:

Connection disconnected with error 'Error: Server returned an error on close: Connection closed with an error. InvalidOperationException: A suitable constructor for type 'Microsoft.AspNetCore.SignalR.Hub' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.'.

我的代码:

在 Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    //...

    services.AddSignalR(o =>
    {
        o.EnableDetailedErrors = true;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //...

    app.UseSignalR(routes =>
    {
        routes.MapHub<Hub>("/shoutboxHub");
    });

    //...
}

在 HomeController.cs

public class HomeController : Controller
{
    private readonly ShoutboxDbContext context;
    private readonly IHubContext<Hub> hub;

    public HomeController(ShoutboxDbContext context, IHubContext<Hub> hub)
    {
        this.hub = hub;
        this.context = context;
    }

    //...

    [HttpPost]
    public IActionResult AddMessage([FromBody]Message input)
    {
        //...

        hub.Clients.All.SendAsync("Refresh");

        return Json((Object)true);
    }
}

在 Index.js 中

var connection = new signalR.HubConnectionBuilder().withUrl("/shoutboxHub").build();

connection.on("Refresh", function () {
    updateMessageBox();
});

connection.start().catch(function (err) {
    return console.error(err.toString());
});

标签: dockerasp.net-coresignalr

解决方案


更新:

好的,我又让它工作了。问题显然是这Microsoft.AspNetCore.SignalR.Hub显然不是一个具体的类型。Hub我不知道这到底是如何定义的,在什么意义上不是具体的。我只知道这个可笑的修复解决了我的问题:

我制作了自己的集线器,名为ShoutboxHub

using Microsoft.AspNetCore.SignalR;

namespace Shoutbox.Hubs
{
    public class ShoutboxHub : Hub
    {
    }
}

...并将包含的三行更改HubShoutboxHub(并添加了using Shoutbox.Hubs;,但这是不言而喻的)。就是这样。


推荐阅读