定义可以在服务器上调用的客户端方法
要定义服务器可以调用的方法,请使用代理的On方法来注册事件处理程序。
方法名称匹配是不区分大小写的。 例如,服务器上的Clients.All.UpdateStockPrice将在客户端上执行updateStockPrice,updatestockprice或UpdateStockPrice。
不同的客户端平台对于如何编写方法代码来更新UI有不同的要求。 显示的示例是WinRT(Windows Store .NET)客户端。 WPF,Silverlight和控制台应用程序示例在本主题后面的单独部分中提供。
正在处理的方法没有参数,请使用On方法的非泛型重载:
服务器代码调用无参数的客户端方法
服务器代码如下:
public class StockTickerHub : Hub { public void NotifyAllClients() { Clients.All.Notify(); } }
WinRT Client
var hubConnection = new HubConnection("http://www.contoso.com/"); IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub"); stockTickerHub.On("notify", () => // Context is a reference to SynchronizationContext.Current Context.Post(delegate { textBox.Text += "Notified!\n"; }, null) ); await hubConnection.Start();
带参数的方法指定参数类型
服务器代码:
public void BroadcastStockPrice(Stock stock) { context.Clients.Others.UpdateStockPrice(stock); } //复合数据原型 public class Stock { public string Symbol { get; set; } public decimal Price { get; set; } }
WinRT Client
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => // Context is a reference to SynchronizationContext.Current Context.Post(delegate { textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price); }, null) );
带参数的方法,使用动态对象作为参数
public void BroadcastStockPrice(Stock stock) { context.Clients.Others.UpdateStockPrice(stock); } public class Stock { public string Symbol { get; set; } public decimal Price { get; set; } }
WinRT Client
stockTickerHubProxy.On("UpdateStockPrice", stock => // Context is a reference to SynchronizationContext.Current Context.Post(delegate { textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price); }, null) );
移除一个handler
var updateStockPriceHandler = stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Context.Post(delegate { textBox.Text += string.Format("Stock update for {0} new price {1}\n", stock.Symbol, stock.Price); }, null) ); updateStockPriceHandler.Dispose();
调用服务器方法
服务器代码:
public class StockTickerHub : Hub { public void JoinGroup(string groupName) { Groups.Add(Context.ConnectionId, groupName); } }
客户端代码,无返回值
stockTickerHubProxy.Invoke("JoinGroup", "SignalRChatRoom");
服务器上有返回值的方法
public IEnumerable<Stock> AddStock(Stock stock) { _stockTicker.AddStock(stock); return _stockTicker.GetAllStocks(); } public class Stock { public string Symbol { get; set; } public decimal Price { get; set; } }
客户端调用(异步调用)
var stocks = await stockTickerHub.Invoke<IEnumerable<Stock>>("AddStock", new Stock() { Symbol = "MSFT" }); foreach (Stock stock in stocks) { textBox.Text += string.Format("Symbol: {0} price: {1}\n", stock.Symbol, stock.Price); }
客户端调用(同步调用)
var stocks = stockTickerHub.Invoke<IEnumerable<Stock>>("AddStock", new Stock() { Symbol = "MSFT" }).Result; foreach (Stock stock in stocks) { textBox.Text += string.Format("Symbol: {0} price: {1}\n", stock.Symbol, stock.Price); }