SignalR入门之持久性连接

为了保持客户端和服务端之间的持久性连接的开发性,并且使用传输在这这样的连接上发送数据,这个用来访问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消息。
时间: 2024-10-11 17:54:05

SignalR入门之持久性连接的相关文章

SignalR入门之多平台SignalR服务端

之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP.Net构成托管SignalR服务的唯一环境,但事实上并非如此,很多情况下采用的并非是IIS和ASP.NET. 现在,在这里以控制台程序为例,将SignalR服务端建立在控制台程序里. 如何在控制台程序实现基于Hub或持久性连接的SignalR服务呢,首先安装下面的包: install-package

LVS负载均衡之持久性连接介绍(会话篇)

在实际生产环境中,往往需要根据业务应用场景来设置lvs的会话超时时间以及防session连接丢失的问题提,如在业务支付环节,如若session丢失会导致重复扣款问题,严重影响到安全性,本小节解将会讲到关于lvs持久性连接问题 一.lvs负载均衡持久连接介绍: 引子(案例) 对于电子商务网站来说,用户在挑选商品的时候使用的是80端口来浏览的,当付款的时候则是通过443的ssl加密的方式,当然当用户挑选完商品付款 的时候,我们当然不希望https的443跳转到另外一台REAL SERVER上,很显然

ASP.NET SignalR入门

前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM2.0之后,于是对Web聊天产生了兴趣.那么在.NET平台下的Web聊天有哪些呢?查找资料发现了ASP.NET SignalR.于是乎...So...Just do it! 简介 按照惯例,先介绍一下什么是SignalR.简单的说,ASP .NET SignalR 是一个ASP .NET 下的类库,

一、SignalR入门

准备: 开发工具:visual studio 2013 使用框架:SignalR.Jquery 正文 概述 基于ASP.NET web 应用程序创建并引用SignalR 和JQuery框架简单实现文字聊天 开发任务: A.创建一个空的ASP.NET web 项目 B.引用SignalR 和Jquery框架 C.创建一个集线器类,以将内容推送到客户端. D.创建一个OWIN Startup类,配置启动. E.在Web中使用SignalR jQuery实现消息的收发.     效果图展示: 开发步骤

SignalR入门篇

一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二,实现机制 SignalR 的实现机制与 .NET WCF 或 Remoting 是相似的,都是使用远程代理来实现.在具体使用上,有两种不同目的的接口:PersistentCo

SignalR入门

一:什么是signalR Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,signalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通信,随着Html5中WebSockets出现,SignalR也支持WebSockets通信.另外SignalR开发的程序不仅仅限制于宿主在IIS中,也可以宿主在任何应用程序,包括控制台,客户端程序和Windows服务等,另外还支持Mono,这意味着它可以实现跨平台部署在Linux环境下. Sig

Docker入门实战-SSH连接docker容器

简介 什么是Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护. Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc.Redhat 已经在其 RHEL6.5 中集中支持 Docker:Google 也在其 PaaS

实体框架 (EF) 入门 => 五、连接和模型

public class BloggingContext : DbContext  {  public BloggingContext()          : base("name=BloggingCompactDatabase")      {      }  } 使用此形式可以明确要求在配置文件中查找连接字符串.如果未找到具有给定名称的连接字符串,则将引发异常. <configuration>     <connectionStrings>       &

asterisk-java ami 入门篇,连接与关闭服务器

我选择的是通过AsteriskServer 来生成连接,因为后面要通过AsteriskServer来进行监听通话属性的改变. demo: AsteriskServer asteriskServer=new DefaultAsteriskServer("服务器ip", "账号","密码");   if(asteriskServer!=null){  ManagerConnection conn=asteriskServer.getManagerCo