为了保持客户端和服务端之间的持久性连接的开发性,并且使用传输在这这样的连接上发送数据,这个用来访问SignalR持久性连接的底层API提供了一个隐藏底层固有复杂性的抽象层。
事实上,通过该API访问通信通道和在底层使用Socket方式类似:
在服务端,当连接打开或关闭、接受数据、给客户端发送信息时我们将被通知。在客户端,我们可以打开或关闭连接,发送或接受任何数据。与Socket一样,消息没有格式,可以说它的格式是传统数据格式——文本字符串。
从客户端来看,只需要发起一个到服务端的连接就可以立即使用它来发送数据,并通过SignalR调用的一个回调函数执行信息的接收。
从服务端来看,持久连接是继承自PersistentConnection的一个类,为了能够在某个事件产生时允许采取控制,可以对该类的一些方法进行重写。
每个持久连接都可以通过某个URL从外部进行访问。因此可以采用和其他框架,如 mvc、web api类似的一些方法。
接下来就是配置SignalR将每一个持久连接同其访问路径进行关联。
以前的SignalR版本必须通过global.asax执行相关的注册,但在2.0后都已经整合到OWIN中。
SignalR应用程序运行基于OWIN上的宿主进程中,该宿主程序将在应用程序的根名称空间查找一个为名Startup的类,然后执行它的Configuration方法。
首先在Web应用程序的根目录建立Startup类,
如:
1 using System; 2 using System.Threading.Tasks; 3 using Microsoft.Owin; 4 using Owin; 5 6 [assembly: OwinStartup(typeof(Startup))] 7 8 public class Startup 9 { 10 public void Configuration(IAppBuilder app) 11 { 12 13 } 14 }
上面的Configuration方法可以看成是启动方法,在该方法里可以建立相对应的SignalR连接和路径映射。
现在建立一个持久性连接类:TestConnection该类继承自PersistentConnection;当某些和服务以及和PersistentConnection类连接有关的事件产生时,将调用该类提供的虚方法,为了实现这样的逻辑,只需要重写相关方法即可。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading.Tasks; 5 using System.Web; 6 using Microsoft.AspNet.SignalR; 7 8 public class TestConnection : PersistentConnection 9 { 10 protected override Task OnConnected(IRequest request, string connectionId) 11 { 12 return Connection.Send(connectionId, "Welcome!"); 13 } 14 15 protected override Task OnReceived(IRequest request, string connectionId, string data) 16 { 17 return Connection.Broadcast(data); 18 } 19 }
在TestConnection类中,有两个重写自PersistentConnection的方法:OnConnected 和OnRecevied,它们分别表示当有客户端连接时和当客户端发送消息服务端接收消息时。其实,在TestConnection中还可以重写其他方法,在这里默认是这两个。
这两个方法它们有request和connectId这两个共同的参数,request表示与请求相关的参数类似于asp.net中的Request,connectionId是一个字符串,表示客户端的唯一标识符,每个连接的客户端不同,connectionId就不一样。
在OnConnected这个方法中,
return Connection.Send(connectionId, "Welcome!");//表示向刚刚连接的客户端发送“welCome!”字符串消息,这个方法只对一个指定的用户发消息。connectionId就是客户端唯一标识符。
在OnRecevied这个方法中,
return Connection.Broadcast(data);//data是某一个客户端发送过来的消息,整个方法意思是向所有的客户端发送data消息。