环境:
TL; DR:将IHubContext <>注入Controller ctor,以便Action方法可以将消息发送到客户端似乎不起作用。
长版:
我有一个基本的ASP.NET Core测试应用程序,并且.NET客户端能够连接和发送/接收消息。因此,我的集线器和客户端似乎运行良好。
我现在正试图将一个控制器添加到SignalrR Hub所在的同一VS项目中,以便外部参与者可以通过REST API端点发送消息。
为此,我尝试使用DI将IHubContext <>注入到控制器的 ctor 中,如下所示:
README.md
这似乎已成功注入正确的IHubContext,因为当我调试私有成员时,当我连接了1个.NET客户端时,我看到的连接数= 1。
现在麻烦了:在一个动作方法中,我尝试使用_hubContext调用中心方法...但是什么也没发生。调试器通过代码行,并且没有命中Hub内的任何断点。什么都没发生。请注意,.NET客户端(通过SignalR .NET客户端)发送消息时,集线器上的断点确实命中。只是我的Controller / action方法中的_hubContext似乎不起作用。
这是我在 action方法中所做的事情:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : Controller
{
private IHubContext<OrgHub> _hubContext;
public ValuesController(IHubContext<OrgHub> hubContext)
{
_hubContext = hubContext;
}
//...
}
这是对应的 Hub方法:
// GET api/values
[HttpGet]
public async Task<ActionResult<IEnumerable<string>>> GetAsync()
{
//Try to call "SendMessage" on the hub:
await _hubContext.Clients.All.SendAsync("SendMessage", "SomeUserName", "SomeMessage");
//...
return new string[] { "bla", "bla" };
}
如果有帮助,这是 Startup.cs 的编辑版本:
public class OrgHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
//...
}
那么,关于从这里出发的想法或建议呢?显然,我必须忽略了一些东西……
谢谢!
答案 0 :(得分:1)
这不是这样的。当您致电SendAsync
时,该消息会发送给客户端。您不会通过SendAsync
在中心上调用方法。什么也没发生,因为实际上是向客户端发送了一条消息,该消息应该调用监听“ SendMessage” 客户端的内容,这大概不是您已经注册客户端来监听的内容。如果目标是打入客户端的“ ReceiveMessage”,那么您应该在控制器中执行SendAsync("ReceiveMessage", ...)
。