docker - 将项目移动到新 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());
});
解决方案
更新:
好的,我又让它工作了。问题显然是这Microsoft.AspNetCore.SignalR.Hub
显然不是一个具体的类型。Hub
我不知道这到底是如何定义的,在什么意义上不是具体的。我只知道这个可笑的修复解决了我的问题:
我制作了自己的集线器,名为ShoutboxHub
:
using Microsoft.AspNetCore.SignalR;
namespace Shoutbox.Hubs
{
public class ShoutboxHub : Hub
{
}
}
...并将包含的三行更改Hub
为ShoutboxHub
(并添加了using Shoutbox.Hubs;
,但这是不言而喻的)。就是这样。
推荐阅读
- javascript - 为什么 JavaScript 数组中的最后一个空/未定义元素被忽略
- javascript - 如何使用 jest 测试 objectContaining?
- reactjs - 组件返回 TypeError:无法读取未定义的属性“地图”
- javascript - axios 忽略回放
- ios - 使用节页脚视图向页脚视图所在的部分添加一行?
- upgrade - What is the difference between Informix server and Informix SE?
- spring - java - 如何在运行应用程序的java spring mvc中修复错误HTTP Status 500 Target Unreachable,标识符'...'解析为null?
- python - 如何使用 Python 的 configparser 读取配置文件?
- java - HttpURLConnection getResponseCode() 在代码中返回 200 但在开发工具检查器中它实际上是 500
- angular - 是否可以使用 SFTP 部署 MEAN 堆栈应用程序?