Asp.Net SignalR - 持久连接类
持久连接类
通过SignalR持久连接类可以快速的构建一个即时通讯的应用,上篇博文已经我们创建一个owin Startup类和一个持久连接类来完成我们的工作,然后在Startup类的Configuration方法中添加了我们的中间件,配置名称 myconnection1

简单看一下持久连接类,里面有四个可供我们重写的方法,从字面上就可以看出是什么意思,需要一提的是持久连接类是享元模式的实践,因为一个客户端和服务器的连接过程中只会创建一个对象,后面都不会再创建对象。

在调试窗口也可以看到我们的WriteLine信息
下面需要说一下两个参数
request
connectionid
connectionId是一个类似GUID一样的唯一标识,一个客户端的连接会有一个这样的连接Id
Request则是一些浏览器发来的报文以及一些其它的信息
下面可以看深入一下持久连接类的源码,可以看到参数 environment 是一个字典,这是owin的规范
public Task ProcessRequest(IDictionary<string, object> environment)
{
HostContext context = new HostContext(environment);
environment.DisableRequestCompression();
environment.DisableResponseBuffering();
OwinResponse response = new OwinResponse(environment);
response.get_Headers().Set("X-Content-Type-Options", "nosniff");
if (this.Authorize(context.Request))
{
return this.ProcessRequest(context);
}
if ((context.Request.User != null) && context.Request.User.Identity.IsAuthenticated)
{
response.set_StatusCode(0x193);
}
else
{
response.set_StatusCode(0x191);
}
return TaskAsyncHelper.Empty;
}
最后会走到这个方法到达我们的OnConnected事件里
private Task ProcessStartRequest(HostContext context, string connectionId)
{
return this.OnConnected(context.Request, connectionId).OrEmpty().Then<HostContext>(((Func<HostContext, Task>) (c => SendJsonResponse(c, "{ \"Response\": \"started\" }"))), context).Then<IPerformanceCounterManager>(delegate (IPerformanceCounterManager c) {
c.ConnectionsConnected.Increment();
}, this.Counters);
}
上面过多关注了服务器这边的配置,是时候把注意力转移到前端代码上
let conn = $.connection("/myconnection");
conn.start(function () {
conn.send("你好啊");
});
//会出错
conn.send("你好啊");
conn.received(function (data) {
console.log("service :" + data);
});
start方法是异步的,也就如果调用了start方法后立即去发送 msg 可能是会出错的,因为那时候可能还没有连接,在start方法里再进行我们的send是不错的选择。
received方法,这似乎没有什么好说的,,,所以就不说了
和服务器端类似,需要我们关于的也仅是这些方法,相信这是很容易去理解的

关于跨域
现在跨域请求越来越多的场景里被使用,现在的主流方案有 JSONP和CORS,对于signalR也是对这两种方式进行了封装,根据当前浏览器的情况进行最佳选择
配置也是非常简单的,但是对于CORS 需要使用nuget下载Microsoft.Owin.Cors包,当然除了这些设置外还需要在headers中进行添加报文
public void Configuration(IAppBuilder app)
{
// 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888 app.Map("/myconnection",o=> { o.RunSignalR<MyConnection1>(new Microsoft.AspNet.SignalR.ConnectionConfiguration() {
//开启jsonp
EnableJSONP = true
});
//开启 cros
o.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
});
}
}
Asp.Net SignalR - 持久连接类的更多相关文章
- ASP.NET SignalR2持久连接层解析
越是到年底越是感觉浑身无力,看着啥也不想动,只期盼着年终奖的到来以此来给自己打一针强心剂.估摸着大多数人都跟我一样犯着这样浑身无力的病,感觉今年算是没挣到啥钱,但是话也不能这么说,搞得好像去年挣到钱了 ...
- 一、ASP.NET Iframework_SignalR永久连接类(v2)
一.新建项目,选MVC项目默认 添加mvc文件夹和核心引用 二.添加SignaIR包 SignalR的准备:NuGet包管理器搜索:工具——>库程序包管理器——>Microsoft.Asp ...
- asp.net signalR 专题—— 第二篇 对PersistentConnection持久连接的快速讲解
上一篇我们快速的搭建了一个小案例,但是并没有对其中的方法进行介绍,这一篇我来逐一解析下. 一:从override的那些方法说起 不管怎么样,我们先上代码,如下: public class MyConn ...
- 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式
1.概述 通过上篇史上最全面的SignalR系列教程-1.认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解.本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然 ...
- Asp.Net SignalR Hub类中的操作详解
Hub类中的操作 在服务端我们要通过Hub类做一系列操作,下面就说说我们都可以做什么操作 客户端的发送消息操作 调用所有的客户端的helloClient方法 Clients.All.helloClie ...
- ASP.NET SignalR入门
前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...
- asp.net signalR 专题—— 第一篇 你需要好好掌握的实时通讯利器
一:背景 我们知道传统的http采用的是“拉模型”,也就是每次请求,每次断开这种短请求模式,这种场景下,client是老大,server就像一个小乌龟任人摆布, 很显然,只有一方主动,这事情就没那么完 ...
- ASP.NET SignalR
何为ASP.NET SignalR,有什么用 ASP.NET SignalR是一个ASP.NET库,是为了实现实时web通信而创造的,能让服务器与客户端实现即时通信,而不需要服务器等待接收到客户端请求 ...
- Asp.Net SignalR Hub中的上下文对象
Hub中的 Context 使用了集线器后,会发现对比持久连接类少了OnConnectioned这样的事件,事实上是有的.需要我们去override .这下似乎发现了什么问题,记得持久连接类中有con ...
随机推荐
- NOIP2013 D1T3 货车运输 zz耻辱记
目录 先来证明下lemma: 图上2点间最小边权最大的路径一定在MST上 感性理解下: 每次kruskal algo都连接最大的不成环边 此时有2个未联通的联通块被连起来. 那么考虑u, v两点的联通 ...
- Bphero-UWB 基站0 和 电脑串口数据格式定义
基站0 通过串口将系统中测得的距离信息发送到电脑,电脑定位软件通过三边定位算法计算出TAG的坐标,基站0 和 定位软件之间的数据格式定义如下(对官方数据结构进行了简化) 更多UWB定位信息请参阅论坛b ...
- 在github上面创建新的分支
第一步:git branch 查看当前分支情况 git branch //查看当前分支情况 第二步:git branch 分支名,新建一个自己的分支 git branch 分支名 // 新建一个自己的 ...
- 原生JS面试题
面试中遇到的原生js题总结 1.js 去重1) indexOf Array.prototype.unique = function(){ var result = []; var len = th ...
- section标签实现文字滚动
h5新增样式 section标签 使用demo //h5新增属性 h5新增滚动的标签 <marquee> <div style="padding-left: 20px;ma ...
- pom string
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- S7 Connection 通讯
参考两个链接: http://www.ad.siemens.com.cn/service/answer/solution.aspx?Q_ID=74626&cid=1029 https://su ...
- centos为docker配置加速器
国内拉去docker镜像慢得可怜,为了解决这个问题,可为docker配置加速器. 1.修改daemon配置文件 sudo mkdir -p /etc/dockervim /etc/docker/dae ...
- prometheus+grafana 监控生产环境机器的系统信息、redis、mongodb以及jmx
介绍: 为了更好的对生产环境的一些中间件和操作系统的运行情况进行可视化的展示,近期了解了下prometheus加上grafana来实现这种效果,由于prometheus是新出来的开源项目,所以,监控的 ...
- Prometheus — Process-exporter进程监控
由于我们常用的node_exporter并不能覆盖所有监控项,这里我们使用Process-exporter 对进程进行监控. 安装process-exporter wget https://githu ...