为了保持客户端和服务端之间的持久性连接的开发性,并且使用传输在这这样的连接上发送数据,这个用来访问SignalR持久性连接的底层API提供了一个隐藏底层固有复杂性的抽象层。

事实上,通过该API访问通信通道和在底层使用Socket方式类似:

在服务端,当连接打开或关闭、接受数据、给客户端发送信息时我们将被通知。在客户端,我们可以打开或关闭连接,发送或接受任何数据。与Socket一样,消息没有格式,可以说它的格式是传统数据格式——文本字符串。

从客户端来看,只需要发起一个到服务端的连接就可以立即使用它来发送数据,并通过SignalR调用的一个回调函数执行信息的接收。

从服务端来看,持久连接是继承自PersistentConnection的一个类,为了能够在某个事件产生时允许采取控制,可以对该类的一些方法进行重写。

每个持久连接都可以通过某个URL从外部进行访问。因此可以采用和其他框架,如 mvc、web api类似的一些方法。

接下来就是配置SignalR将每一个持久连接同其访问路径进行关联。

以前的SignalR版本必须通过global.asax执行相关的注册,但在2.0后都已经整合到OWIN中。

SignalR应用程序运行基于OWIN上的宿主进程中,该宿主程序将在应用程序的根名称空间查找一个为名Startup的类,然后执行它的Configuration方法。

首先在Web应用程序的根目录建立Startup类,

如:

 using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin; [assembly: OwinStartup(typeof(Startup))] public class Startup
{
public void Configuration(IAppBuilder app)
{ }
}

上面的Configuration方法可以看成是启动方法,在该方法里可以建立相对应的SignalR连接和路径映射。

现在建立一个持久性连接类:TestConnection该类继承自PersistentConnection;当某些和服务以及和PersistentConnection类连接有关的事件产生时,将调用该类提供的虚方法,为了实现这样的逻辑,只需要重写相关方法即可。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.SignalR; public class TestConnection : PersistentConnection
{
protected override Task OnConnected(IRequest request, string connectionId)
{
return Connection.Send(connectionId, "Welcome!");
} protected override Task OnReceived(IRequest request, string connectionId, string data)
{
return Connection.Broadcast(data);
}
}

在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消息。

最新文章

  1. OSG动画学习
  2. [转]clrDateTime to Dynamics AX TransDate
  3. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)
  4. dede会员指定栏目发布文章
  5. uva 10474 Where is the Marble? 计数排序
  6. 用JS实现避免重复加载相同js文件
  7. .NET读取Excel
  8. Windows 7如何限制运行特定的应用程序(转载)
  9. Session与Caching
  10. WinDBG中加载SOS和CLR
  11. mysql主从数据库
  12. 在Windows Server2016里通过Hyper-V安装Liunx Container
  13. (原)怎样解决python dataframe loc,iloc循环处理速度很慢的问题
  14. 用IDEA/WebStrom 提交本地项目到Git/码云等
  15. Android TV端的(RecyclerView)水平滚动焦点错乱问题
  16. 开启FIPS协议
  17. echarts - 特殊需求实现代码汇总之【线图】篇
  18. 防范xss的正确姿势
  19. 山寨一个std::bind\boost::bind
  20. NB二人组(二)----归并排序

热门文章

  1. Java多线程系列--“JUC锁”07之 LockSupport
  2. appserv中php升级问题
  3. html5 postMessage解决跨域、跨窗口消息传递
  4. easy-ui JOB 及 小记录
  5. 锋利的JQuery —— 事件和动画
  6. 锋利的JQuery —— Ajax
  7. angularjs decorator
  8. Python中的魔法方法
  9. linux-redis
  10. LVS负载平衡集群(没成型)