个人资料

跳过导航链接首页 > 博客列表 > 博客正文

SignalR教程19-使用.Net客户端调用和执行服务器方法

:

定义可以在服务器上调用的客户端方法

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


songshizhao
最初发表2017/11/20 22:44:49 最近更新2017/11/20 22:44:49 3222
为此篇作品打分
10