要从与Hub类不同的类中调用客户端方法,请获取Hub的SignalR上下文对象的引用,并使用它来调用客户端上的方法或管理组。
The following sample StockTicker
class gets the context object, stores it in an instance of the class, stores the class instance in a static property, and uses the context from the singleton class instance to call the updateStockPrice
method on clients that are connected to a Hub named StockTickerHub
.
// For the complete example, go to // http://www.asp.net/signalr/overview/getting-started/tutorial-server-broadcast-with-aspnet-signalr // This sample only shows code related to getting and using the SignalR context. public class StockTicker { // Singleton instance private readonly static Lazy<StockTicker> _instance = new Lazy<StockTicker>( () => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>())); private IHubContext _context; private StockTicker(IHubContext context) { _context = context; } // This method is invoked by a Timer object. private void UpdateStockPrices(object state) { foreach (var stock in _stocks.Values) { if (TryUpdateStockPrice(stock)) { _context.Clients.All.updateStockPrice(stock); } } }
上面的例子使用了单例模式,以保持Hub上下文在该类的复用。这也是官方建议的方法。
// For the complete example, see // http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-server-broadcast-with-signalr-20 // This sample only shows code that passes connection ID to the non-Hub class, // in order to simulate Clients.Others. public class MoveShapeHub : Hub { // Code not shown puts a singleton instance of Broadcaster in this variable. private Broadcaster _broadcaster; public void UpdateModel(ShapeModel clientModel) { clientModel.LastUpdatedBy = Context.ConnectionId; // Update the shape model within our broadcaster _broadcaster.UpdateShape(clientModel); } } public class Broadcaster { public Broadcaster() { _hubContext = GlobalHost.ConnectionManager.GetHubContext<MoveShapeHub>(); } public void UpdateShape(ShapeModel clientModel) { _model = clientModel; _modelUpdated = true; } // Called by a Timer object. public void BroadcastShape(object state) { if (_modelUpdated) { _hubContext.Clients.AllExcept(_model.LastUpdatedBy).updateShape(_model); _modelUpdated = false; } } }
阅读全文

公众号近期文章
赞赏支持
0 Responses to “SignalR如何从Hub类外部调用客户端方法和管理组”