一:背景

  我们知道传统的http采用的是“拉模型”,也就是每次请求,每次断开这种短请求模式,这种场景下,client是老大,server就像一个小乌龟任人摆布,

很显然,只有一方主动,这事情就没那么完美了,所以为了能够让server也能主动点,html5就应运而生了,或许大家都知道html5中有两种server的主动

模型,第一种叫做websockect,也就是基于tcp模式的双工通讯,还有一种叫做SSE,也就是客户端来订阅服务器的一种事件模型,当然了,在html5出

来之前,如果要做到服务器主动,我们只能采用变相的longpool和foreverframe勉强实现,而signalR这吊毛就是一个对他们进行了高层封装,也就是说

signalR会在这四种技术中根据浏览器和服务器设置采取最优的一种模式,废话不多说,我们快速建立一个例子。

二:快速搭建

  这里我们采用 PersistentConnection模式来构建一个持久连接让大家快速接触下:

1. PersistentConnection

在新建项目中,我们选择”Sig“这里我们就使用默认的名字MyConnection1。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.SignalR;namespace WebApplication1
{public class MyConnection1 : 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);}}
}

在上面,我们简单的看出来了,"持久连接“类有点像socket连接,有OnConnected和OnReceived事件,这里我们就不过多介绍,只要知道

Connection.Send方法中有一个叫做connectionID就好了,而这个connectionID就是客户端和服务器建立连接的唯一标识,比如上面我们看到的

return Connection.Send(connectionId, "Welcome!");就是当客户端连接到服务器之后,服务器主动将客户端推送一个”Welcome",以示欢迎。

2. Startup类

由于signalR采用的是Owin中间件的模式来把signalR和FCL进行隔离,这样的话,大家就可以相互独立,谁也不依赖于谁,也就方便signalR快速独立

发展和更新,而Startup类的Configuration方法就是将一些中间件配置送到Owin管道中,下面我们要做的就是把MyConnection1和"/myconnection"

地址的映射送到Owin管道中,这样当我访问”/myconnection“的时候,就可以触发MyConnection1这个类了,如下图:

[assembly: OwinStartup(typeof(WebApplication1.Startup1))]namespace WebApplication1
{public class Startup1{public void Configuration(IAppBuilder app){app.MapSignalR<MyConnection1>("/myconnection");}}
}

3:新建客户端

这里我们采用web客户端的形式来连接server,这就必须引用一些js文件,比如这里的signalR.js和jquery.js,如下图:

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title><meta charset="utf-8" />
</head>
<body><script src="/scripts/jquery-1.10.2.js"></script><script src="/scripts/jquery.signalR-2.1.2.js"></script><script type="text/javascript">var conn = $.connection("/myconnection");conn.start().done(function (data) {console.log("当前clientID=" + data.id);});//接受服务器的推送conn.received(function (data) {console.log("server返回的数据: " + data);});</script>
</body>
</html>

上面的代码很简单,第一个就是$.connection("/myconnection")用于找到对应的服务器端的Myconnection处理类,第二个start()方法就是开始建

立连接,后面的 received事件就是获取服务器端推送过来的消息,也就是welcome,对吧。。。然后我们在chrome中试试看。

现在,你可以对应代码看一看,start方法成功的拿到了connectionID,而received方法成功的拿到了服务器推送的"welcome"数据,对吧。

四:用Fiddler监视一下

下面就是我用Fiddler监视到的截图,从图中的http 101状态码就可以看出,这里将http协议转换成了websocket协议。然后我们从websocket

协议中看到了服务器端推送过来的“welcome”数据。

好了,本篇大概就这么说了,是不是非常简单,当然里面还有很多的细节没有说,后续我们来慢慢解读。

asp.net signalR 专题—— 第一篇 你需要好好掌握的实时通讯利器相关推荐

  1. asp.net signalR 专题—— 第二篇 对PersistentConnection持久连接的快速讲解

    上一篇我们快速的搭建了一个小案例,但是并没有对其中的方法进行介绍,这一篇我来逐一解析下. 一:从override的那些方法说起 不管怎么样,我们先上代码,如下: 1 public class MyCo ...

  2. TTD 专题 (第一篇):C# 那些短命线程都在干什么?

  3. vue使用e-charts制作专题图(广西省为例)---第一篇

    vue使用E-Charts制作专题图(广西省为例)---第一篇 写博客是为了做笔记 先给大家看一下效果图: "专题图"顾名思义就是地图的每一部分根据一定的标准,展现出不一样颜色,使 ...

  4. .net mvc html访问数据库,【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6) - 三生石上...

    图挂了的说明: 我是在Word中写的本系列文章,然后转成的HTML,所以图片都存在于 fineui.com 服务器,由于临时访问量太多,服务器喘不过气了.... 你可以稍后访问,实在是抱歉...... ...

  5. 第一篇【Python】基础-关东升-专题视频课程

    第一篇[Python]基础-833人已学习 课程介绍         本书是智捷课堂开发的立体化图书中的一本,所谓"立体化图书"就是图书包含:书籍.视频.课件和服务等内容. 其中第 ...

  6. 编程书籍阅读随谈(第一篇)

    做.NET程序员也有几年了,从在大学到现在读过的编程书也的确有不少,读过.NET.Java.Python.Node.JS.底层原理等等的书籍.不知道自己学习的怎么样,但是也的确去学习过这些东西. (备 ...

  7. C# -Asp.Net.SignalR.Core之Hub

    前言 程序员的进步是需要环境的,良好的团队环境,良好的开发环境,会让人进步的更加快速. 所以,我认为,如果一个程序员,在2019年还在用Visual Studio 2005开发,那么,他,大概率,不会 ...

  8. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)...

    大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言  ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...

  9. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(五)之使用RabbitMQ缓存消息

    前言 本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能.源代码不包含LayIM的源代码,因为官方并没开源属于收费资源, ...

最新文章

  1. shell脚本示例:批量比较多个文件的内容是否相同
  2. pytorch1.0.1_将Spring 3.x和Hibernate 3.x升级到Spring Platform 1.0.1(Spring + hibernate 4.x)
  3. Linux 下 4 种实时监控日志文件的方法,总有一种适合你
  4. mysql建表语句主键自增_MYSQL索引-上
  5. windows内核情景分析---进程线程2
  6. 常量池在堆还是方法区_详解Java 虚拟机(第③篇)——String 类和常量池
  7. 也许,我们只需要缺憾的完美!
  8. java项目描述_111个知名Java项目集锦(包括url和描述)
  9. 英超俱乐部面临网络威胁,球队一起训练防御网络攻击
  10. java计算机毕业设计医疗器械销售电子商城源码+系统+mysql数据库+lw文档
  11. 单面打印机双面打印———python pdf拆分重排
  12. 银联收单清算体系和处理流程
  13. java:从淘宝获取优惠券的、带推广链接的、带淘口令的商品信息
  14. 大学计算机考试满分多少分,自主招生考试多少分 最多降多少分
  15. N76E003 驱动 UC1705并口屏(8080)
  16. 经纬度坐标转为上海地方坐标代码(js代码)
  17. iOS 拓展,icon,尺寸 开发系列 吕文翰
  18. uniapp微信小程序实现连接低功耗蓝牙打印功能
  19. OSI七层网络参考模型详解
  20. 深度学习笔记(一)了解深度学习

热门文章

  1. C#启动前为所有的Form设置统一的Icon
  2. MacBook取消自启动程序
  3. 开课吧课堂之如何使用多重catch语句
  4. bash之read命令
  5. 李洪强-HEAD 和nil和NULL
  6. connect()在UDP连接中的应用一例
  7. 【细节实现题】LeetCode 57. Insert Interval
  8. Leetcode 303.区域和检索 - 数组不可变
  9. tf.one_hot函数用法
  10. python下:用 matplotlib.pyplot 显示 Opencv 读取的图像