我目前正在尝试RC2发布,ASP.NET Core我遇到了一个问题SignalR.我需要能够在请求线程之外向客户端发送消息.
现在在完整的.NET框架中,您可以这样做:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.<SendMessage>()
但在ASP.NETCore中没有GlobalHost.
我发现了一个类似的问题: 如何在vNext项目中获取SignalR Hub上下文?
第二个答案提供了一种在请求线程之外获取hubcontext的方法,但这也不起作用ASP.NET Core.
所以我的问题是:如何在ASP.NET Core中的请求范围之外获取集线器上下文?
我刚刚更新了一些SignalR引用,但为了允许一般类型的Hub,情况有所改变Hub<T>.在现有的示例和文档中,例如:
我们有一个静态类,通过以下机制保存对客户端的引用:
public class StockTicker()
{
private readonly static Lazy<StockTicker> _instance = new Lazy<StockTicker>(
            () => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients));
 IHubConnectionContext Clients {get;set;}
 private StockTicker(IHubConnectionContext clients)
        {
            Clients = clients;
        }
}
因此检查静态引用,如果为null则它会到达:
GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients
创建实例并通过构造函数提供客户端.
所以这就是它以前的工作方式,而且确实是上面的网址是如何工作的.但现在Hub<T>构造函数需要稍微改变:
 private StockTicker(IHubConnectionContext<dynamic> clients)
 {
   Clients = clients;
 }
现在我的问题是如何进一步扩展这一点,以便我的StockTicker版本可以为x类型的客户端提供强类型属性.
 IHubConnectionContext<StockTickerHub> Clients {get;set;}
 private StockTicker(IHubConnectionContext<dynamic> clients)
 {
   Clients = clients; // Fails, wont compile
 }
通过维护强类型引用,我可以调用强类型方法等.
我只是想知道为什么Microsoft 推荐的 Blazor-Server-Chat 解决方案是初始化 Signal R Hub。从技术上来说,所有的C#代码都是在服务器上执行的,所以也可以通过单例来实现聊天:
public class MySingleton
{
    public event Action<string> OnBroadcast
    public void Send(string msg)
    {
        OnBroadcast.Invoke(msg);
    }
}
在 Blazor 组件中,我使用此单例、订阅事件并调用Send(...).
为什么我应该使用单独的 SignalR Hub 来实现此聊天?