将项目移至新PC后,docker中的.NET Core 2.1的SignalR无法正常工作

时间:2018-09-04 13:09:16

标签: docker asp.net-core signalr

更新:已解决(如下所述)

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

我的问题是这样的:我尝试从JS设置到服务器的SignalR连接时,它在JS-Console中告诉我找不到匹配的构造函数。在AddMessage()中使用断点查看中心对象时,该对象不是null,因此某种构造函数正在运行。

我不知道该怎么办。

错误消息:

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());
});

1 个答案:

答案 0 :(得分:0)

更新:

好的,我又恢复了工作。问题显然是Microsoft.AspNetCore.SignalR.Hub显然不是具体类型。我不知道该如何定义以及Hub在什么意义上并不具体。我只知道此冗长的修复程序解决了我的问题:

我创建了自己的集线器ShoutboxHub

using Microsoft.AspNetCore.SignalR;

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

...,并将包含Hub的三行更改为ShoutboxHub(并添加了using Shoutbox.Hubs;,但这不用多说)。就是这样。