【问题标题】:SignalR - Call statically typed hub from ContextSignalR - 从上下文调用静态类型的集线器
【发布时间】:2018-05-13 22:00:45
【问题描述】:

我试图弄清楚如何从服务器调用强类型集线器上的方法。我正在使用 .Net-Core 2.0

我有一个强类型的集线器界面:

public interface IMessageHub
{
    Task Create(Message message);
}

还有一个看起来像这样的集线器:

public class MessageHub: Hub<IMessageHub>
{
    public async Task Create(Message message)
    {
        await Clients.All.Create(message);       
    }
}

通常在服务器上我可能会像这样将内容推送到客户端:

[Route("api/[controller]")]
public MessagesController : Controller
{
       IHubContext<MessagesHub> context;
       public MessagesController(IHubContext<MessagesHub> context)
       {
           this.context = context;
       }

       public Message CreateMessage(Message message)
       {
          this.context.Clients.All.InvokeAsync("Create", message);
          return message;
       }
}

如何在静态类型的集线器上调用方法,或者我对集线器的工作方式有误解?

【问题讨论】:

  • stackoverflow.com/questions/46904678/…。在解决方案 2 中,您将找到解决方案。
  • @Tester 谢谢我之前尝试过这样做,但我简化了问题,我真正的问题是如果我的客户端接口是通用的,它需要一个 DTO 来推送到客户端怎么办?

标签: c# signalr asp.net-core-2.0


【解决方案1】:

是的,你可以。这是一步一步的示例:

简单地创建一个接口,您可以在其中定义服务器可以在客户端上调用哪些方法:

public interface ITypedHubClient
  {
    Task BroadcastMessage(string name, string message);
  }

从 Hub 继承:

 public class ChatHub : Hub<ITypedHubClient>
      {
        public void Send(string name, string message)
        {
          Clients.All.BroadcastMessage(name, message);
        }
      }

将您输入的 hubcontext 注入您的控制器,并使用它:

[Route("api/demo")]
  public class DemoController : Controller
  {   
    IHubContext<ChatHub, ITypedHubClient> _chatHubContext;
    public DemoController(IHubContext<ChatHub, ITypedHubClient> chatHubContext)
    {
      _chatHubContext = chatHubContext;
    }
    // GET: api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
      _chatHubContext.Clients.All.BroadcastMessage("test", "test");
      return new string[] { "value1", "value2" };
    }
  }

【讨论】:

  • 我会改正,因为这是答案,但是如果我的接口类型接受泛型参数,你知道我可以做到这一点的方法
  • @johnny 5 目前我不知道。今天晚上我必须先测试
  • 谢谢,我遇到了一些主要的架构问题,我什至不确定我想做的事情是否可行,我也在寻找 IHubContext 的不变版本,我可能需要重新设计一切
  • 我不明白为什么ChatHub 本身有一个Send 方法,因为您实际上并没有在DemoController 中使用它。我对此进行了测试,您只需删除ChatHub 中的方法,它仍然可以正常工作。很遗憾你不能在ChatHub 中使用那个Send 方法。然后你可以在那里封装你想要发送的客户端等等。
  • _chatHubContext.Clients.All.BroadcastMessage("test", "test");不调用 hub 方法,而是直接调用客户端。
【解决方案2】:

所以 ChatHub 中的 send 方法在示例中并不真正相关。实际上,只需要在 ITypedHubClient 中定义方法,不需要实现,对吗? singalR 会神奇地将服务器端的调用转换为 SendAsync('BroadcastMessage', blah blah)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多