定义可以在服务器上调用的客户端方法
要定义服务器可以调用的方法,请使用代理的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);
}