SignalR:无法从控制器调用集线器方法

时间:2018-07-10 16:11:22

标签: c# asp.net-core signalr signalr-hub asp.net-mvc-controller

环境:

  • 具有最新更新的Visual Studio 2017社区
  • 目标框架:.NET Core 2.1(最新版本)
  • SignalR核心
  • 在Windows 10(开发环境)上的IIS Express上运行

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);
    }

    //...

}

那么,关于从这里出发的想法或建议呢?显然,我必须忽略了一些东西……

谢谢!

1 个答案:

答案 0 :(得分:1)

这不是这样的。当您致电SendAsync时,该消息会发送给客户端。您不会通过SendAsync在中心上调用方法。什么也没发生,因为实际上是向客户端发送了一条消息,该消息应该调用监听“ SendMessage” 客户端的内容,这大概不是您已经注册客户端来监听的内容。如果目标是打入客户端的“ ReceiveMessage”,那么您应该在控制器中执行SendAsync("ReceiveMessage", ...)