我在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.'.
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");
});
//...
}
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);
}
}
var connection = new signalR.HubConnectionBuilder().withUrl("/shoutboxHub").build();
connection.on("Refresh", function () {
updateMessageBox();
});
connection.start().catch(function (err) {
return console.error(err.toString());
});
答案 0 :(得分:0)
好的,我又恢复了工作。问题显然是Microsoft.AspNetCore.SignalR.Hub
显然不是具体类型。我不知道该如何定义以及Hub
在什么意义上并不具体。我只知道此冗长的修复程序解决了我的问题:
我创建了自己的集线器ShoutboxHub
:
using Microsoft.AspNetCore.SignalR;
namespace Shoutbox.Hubs
{
public class ShoutboxHub : Hub
{
}
}
...,并将包含Hub
的三行更改为ShoutboxHub
(并添加了using Shoutbox.Hubs;
,但这不用多说)。就是这样。