我在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()
中的断点查看hub对象时,它不是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());
});
好的,我让它再次运作。问题显然是Microsoft.AspNetCore.SignalR.Hub
显然不是具体类型。究竟是怎么定义的,在什么意义上Hub
不具体,我不知道。我只知道这个荒谬的解决方案解决了我的问题:
我创建了自己的Hub,名为ShoutboxHub
:
using Microsoft.AspNetCore.SignalR;
namespace Shoutbox.Hubs
{
public class ShoutboxHub : Hub
{
}
}
...并将包含Hub
的三行更改为ShoutboxHub
(并添加了using Shoutbox.Hubs;
,但这不言而喻)。而已。