访问 asp.net 核心信号器中的 hubcontext 实例
Accessing a hubcontext instance in asp.net core signalr
我正在关注 guide 为我的 asp.net 核心项目设置信号器。
在遵循本指南的同时,我得到了这段代码:
void SendMessage(string message)
{
GlobalHost
.ConnectionManager
.GetHubContext<NotificationHub>().Clients.sendMessage(
message);
}
我有一个 NotificationHub
文件,如下所示:
public class NotificationHub : Hub
{
public string Activate()
{
return "Monitor Activated";
}
}
Globalhost 用于获取 Hubcontext
对象。
问题是当我导入 signalR 时,没有任何名为 GlobalHost
的东西可用。在 documentation 我可以找到关于它的信息:
GlobalHost
ASP.NET Core has dependency injection (DI) built into the framework. Services can use DI to
access the HubContext. The GlobalHost object that is used in ASP.NET SignalR to get a HubContext
doesn't exist in ASP.NET Core SignalR.
好的,所以 Globalhost
在核心中根本不可用。
我需要做同样的代码,但是 Microsoft.AspNetCore.SignalR;
。
现在我怎样才能得到一个 Hubcontext
对象?
编辑
我现在尝试按照文档中的最小示例创建一个小型示例项目。
我的``startup.csfile has this line, in
ConfigureServices`:
services.AddSignalR();
和 Configure
中的这一行:
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<NotificationHub>("/Hubs");
});
我的 Hub 文件如下所示,如文档中所示:
namespace mvcCoreSample.Hubs
{
public class NotificationHub : Hub
{
public Task SendMessage(string user, string message)
{
return Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
}
其中 Hubs 是与 startup.cs 位于同一目录中的文件夹。
我有一个看起来像这样的控制器,它调用集线器:
public class msgController : Controller
{
public IActionResult Index()
{
NotificationHub hub = new NotificationHub();
hub.SendMessage("user1", "some message");
return Content("serving content");
}
}
但是当我 运行 这个,并转到控制器的 url 时,集线器在 sendmessage
函数中抛出错误:
Microsoft.AspNetCore.SignalR.Hub.Clients.get returned null.
我真的看不出哪里错了,hub 一定是少了什么?也许与建立连接有关?
编辑 2
经过几次更正,我将控制器更改为如下所示:
public IActionResult Index(IHubContext<NotificationHub> hub)
{
var clients = hub.Clients;
return Content("serving content");
}
尽管我仍然不知道如何调用我的 sendmessage
函数,但我想试试这个。
当 运行在调试模式下连接此站点时,我在浏览器中抛出此错误:
InvalidOperationException: Could not create an instance of type 'Microsoft.AspNetCore.SignalR.IHubContext`1[[mvcCoreSample.Hubs.NotificationHub, mvcCoreSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. Model bound complex types must not be abstract or value types and must have a parameterless constructor. Alternatively, give the 'hub' parameter a non-null default value.
您可以像这样将其注入服务的构造函数中:
SomeService(IHubContext<NotificationHub> hub)
您可能正在查看一些旧文档。请在此处查看官方文档:Use hubs in SignalR for ASP.NET Core
我正在关注 guide 为我的 asp.net 核心项目设置信号器。
在遵循本指南的同时,我得到了这段代码:
void SendMessage(string message)
{
GlobalHost
.ConnectionManager
.GetHubContext<NotificationHub>().Clients.sendMessage(
message);
}
我有一个 NotificationHub
文件,如下所示:
public class NotificationHub : Hub
{
public string Activate()
{
return "Monitor Activated";
}
}
Globalhost 用于获取 Hubcontext
对象。
问题是当我导入 signalR 时,没有任何名为 GlobalHost
的东西可用。在 documentation 我可以找到关于它的信息:
GlobalHost
ASP.NET Core has dependency injection (DI) built into the framework. Services can use DI to
access the HubContext. The GlobalHost object that is used in ASP.NET SignalR to get a HubContext
doesn't exist in ASP.NET Core SignalR.
好的,所以 Globalhost
在核心中根本不可用。
我需要做同样的代码,但是 Microsoft.AspNetCore.SignalR;
。
现在我怎样才能得到一个 Hubcontext
对象?
编辑
我现在尝试按照文档中的最小示例创建一个小型示例项目。
我的``startup.csfile has this line, in
ConfigureServices`:
services.AddSignalR();
和 Configure
中的这一行:
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<NotificationHub>("/Hubs");
});
我的 Hub 文件如下所示,如文档中所示:
namespace mvcCoreSample.Hubs
{
public class NotificationHub : Hub
{
public Task SendMessage(string user, string message)
{
return Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
}
其中 Hubs 是与 startup.cs 位于同一目录中的文件夹。 我有一个看起来像这样的控制器,它调用集线器:
public class msgController : Controller
{
public IActionResult Index()
{
NotificationHub hub = new NotificationHub();
hub.SendMessage("user1", "some message");
return Content("serving content");
}
}
但是当我 运行 这个,并转到控制器的 url 时,集线器在 sendmessage
函数中抛出错误:
Microsoft.AspNetCore.SignalR.Hub.Clients.get returned null.
我真的看不出哪里错了,hub 一定是少了什么?也许与建立连接有关?
编辑 2
经过几次更正,我将控制器更改为如下所示:
public IActionResult Index(IHubContext<NotificationHub> hub)
{
var clients = hub.Clients;
return Content("serving content");
}
尽管我仍然不知道如何调用我的 sendmessage
函数,但我想试试这个。
当 运行在调试模式下连接此站点时,我在浏览器中抛出此错误:
InvalidOperationException: Could not create an instance of type 'Microsoft.AspNetCore.SignalR.IHubContext`1[[mvcCoreSample.Hubs.NotificationHub, mvcCoreSample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'. Model bound complex types must not be abstract or value types and must have a parameterless constructor. Alternatively, give the 'hub' parameter a non-null default value.
您可以像这样将其注入服务的构造函数中:
SomeService(IHubContext<NotificationHub> hub)
您可能正在查看一些旧文档。请在此处查看官方文档:Use hubs in SignalR for ASP.NET Core