SignalR---DOTNET客户端
2024-09-01 00:54:42
这里面有用到异步的相关知识,本人前几篇文章也简单的提到。
SignalR客户端要寄宿在.NET的客户端,必须安装Microsoft.AspNet.SignalR.Client。 如何建立一个连接
var hubConneciton=new HubConnection("http://www.contos.com/");
IHubProxy stockTickerHubProxy=hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice",stock=>Console.WrireLine("Stock update");
await hubConnection.Start();
); Start是一个异步方法
C#
await connection.Start();
css
connection.Start().Wait(); 配置连接
在建立连接之前可以做一些配置。 设置最大并发数
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
ServicePointManager.DefaultConnectionLimit = 10;
await hubConnection.Start();
默认最大并发数为2。 添加连接字符串
客户端
var querystringData = new Dictionary<string, string>();
querystringData.Add("contosochatversion", "1.0");
var connection = new HubConnection("http://contoso.com/", querystringData); 服务端
public class StockTickerHub : Hub
{
public override Task OnConnected()
{
var version = Context.QueryString["contosochatversion"];
if (version != "1.0")
{
Clients.Caller.notifyWrongVersion();
}
return base.OnConnected();
}
} 设置传输方法
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start(new LongPollingTransport()); 关于传输方式在Microsoft.AspNet.SignalR.Client.Transports命名空间下。
LongPollingTransport、ServerSentEventsTransport、WebSocketTranspor、WebSocketTranspor。
ForevenFrame不被包含在内,因为它只在浏览器中使用。 指定HTTP头信息
hubConnection = new hubConnection("http://www.contoso.com/");
connection.Headers.Add("headername", "headervalue");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await connection.Start(); 指定客户端的证书
使用connection对象的AddClientCertificate方法。
hubConnection = new hubConnection("http://www.contoso.com/");
hubConnection.AddClientCertificate(X509Certificate.CreateFromCertFile("MyCert.cer"));
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await connection.Start(); 创建Hub代理
服务端
public class StockTickerHub : Hub [HubName("stockTicker")]
public class StockTickerHub : Hub 客户端
var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start(); var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("stockTicker");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock =>
Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start(); 定义客户端方法
使用代理的On方法去注册事件处理器,方法名符合驼峰命名法。
服务端的Client.All.UpdateStockPrice方法名将会匹配客户端的
udateStockPrice、updatestockprice、UpdateStockPrice方法。 没有参数的方法
服务端
public class StockTickerHub : Hub
{
public void NotifyAllClients()
{
Clients.All.Notify();
}
} 客户端
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(); 有参数的方法
使用On方法的泛型On<T>指定参数的类型。
服务端
public void BroadcastStockPrice(Stock stock)
{
context.Clients.Others.UpdateStockPrice(stock);
} public class Stock
{
public string Symbol { get; set; }
public decimal Price { get; set; }
} 客户端
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)
); 也可以为动态对象
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)
);
不通过On的泛型指定参数类型。 移除方法
C#
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)
); css
updateStockPriceHandler.Dispose(); 客户端调用服务端的方法
使用Hub代理的Invoke方法。 没有返回值
服务端
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 = 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);
} 连接生命周期事件
SignalR提供以下可以处理的连接生命周期事件:
Received:在连接上收到任何数据时触发。提供收到的数据。
ConnectionSlow:当客户端检测到缓慢或频繁丢弃的连接时引发。
Reconnecting:当底层传输开始重新连接时引发。
Reconnected:当底层运输工具重新连接时提起。
StateChanged:连接状态发生变化时触发。提供旧状态和新状态
Closed:连接断开连接时触发。 示例:
hubConnection.ConnectionSlow += () => Console.WriteLine("Connection problems.");
注册事件。 处理错误
如果没有在服务器上显式启用详细的错误消息,则SignalR在错误后返回的异常对象包含有关错误的最少信息。 服务端开启详细信息
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
App.MapSignalR(hubConfiguration); 为signalR引发的错误注册事件
hubConnection.Error += ex => Console.WriteLine("SignalR error: {0}", ex.Message); 在try-catch块中处理
try
{
IEnumerable<Stock> stocks = await stockTickerHub.Invoke<IEnumerable<Stock>>("GetAllStocks");
foreach (Stock stock in stocks)
{
Console.WriteLine("Symbol: {0} price: {1}", stock.Symbol, stock.Price);
}
}
catch (Exception ex)
{
Console.WriteLine("Error invoking GetAllStocks: {0}", ex.Message);
} 启用客户端日记记录
通过连接对象的TrackLevel和TraceWriter属性设置。
var hubConnection = new HubConnection("http://www.contoso.com/");
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
最新文章
- Beta版本冲刺———第一天
- Mysql 5.7.10以上版本安装大坑
- SQL Server 2008 R2导出数据脚本的方法
- RAID阵列的初始化与管理
- Java学习笔记--对象克隆
- 【Xamarin开发IOS-IOS生命周期】
- httpclient超时总结(转)
- SQL Server 2008性能故障排查(四)——TempDB
- 深度学习卷积网络中反卷积/转置卷积的理解 transposed conv/deconv
- 【nodejs】初识 NodeJS(二)
- 安装mysql(macos系统)
- Huffman树与编码
- es6 对象的扩展
- BZOJ3616 : War
- Android——开机启动功能(Service和BroadcastReceiver)
- 为VS定制一个自己的代码生成器 - 自定义工具开发
- Sublime text 2/3 SVN插件及使用方法
- Spark Sql的UDF和UDAF函数
- HTML DOM 初学笔记
- P4449 于神之怒加强版 (莫比乌斯反演)
热门文章
- <;a href=&#39;javacript:&#39; title=&#39;{$str}&#39;>;是什么意思(多看学习视频)
- WINDOWS 同步(Interlocked,InterlockedExchangeAdd,Slim读/写锁,WaitForSingleObject,CreateWaitableTimer等等)
- 小强的HTML5移动开发之路(21)—— PhoneGap
- Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/vm10-0-0-19
- Maven 学习总结
- 让delphi2010操作界面回到delphi7模式
- 一个2013届毕业生(踏上IT行业)的迷茫(5)
- tcl/tk 调用选择路径的窗口
- 我的MBTI职业性格测试
- Java设计模式透析之 —— 组合(Composite)