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 ...
随机推荐
- StackExchange.Redis超时的问题
最近公司有个项目,在请求量大的情况下,有大量的错误日志是关于redis超时的问题: Timeout performing SET XXX, inst: 27, mgr: ProcessReadQueu ...
- VMware Workstation安装Red hat7.0联网问题总结
1.在red hat7当中iconfig命令是被取消了的,开发者用ip addr命令取代了ifconfig命令. 当然也是可以用ifconfig命令的 (前提是你安装的linux是可以联网的): 1) ...
- delphi 鼠标拖动
GetWindowRect(tgph, Rect); //获得窗体大小 setcursorpos(Rect.Left + 487, Rect.Top + 274); delay(100); mouse ...
- [JZOJ3588]【中山市选2014】J语言(表达式解析+栈)
Description J语言作为一门编程语言,诞生于20世纪90年代.............. 好学的小H今天又学到了一种新东西——J语言.显然,J语言的背景已经被小H忘得一干二净了,但是小H仍然 ...
- php一些高级函数方法
PHP高级函数 1.call_user_func (http://php.net/manual/zh/function.call-user-func.php) 2.get_class (http:// ...
- 定位方式(d16)
一,回顾, ①selector和xpath的区别,selector是解析的html,xpth是解析的xml,所以使用selector比使用xpath快, ②定位元素的单数和复数,当使用单数定位不到元素 ...
- Matlab调用遗传工具箱复现论文模型求解部分
原文转载自:https://blog.csdn.net/robert_chen1988/article/details/52431594 论文来源: https://www.sciencedirect ...
- Angular 2项目的环境配置和项目搭建
AngularJS2 发布于2016年9月份,它是基于ES6来开发的. AngularJS2 是一款开源JavaScript库,由Google维护,用来协助单一页面应用程序运行.AngularJS2 ...
- python中的单向循环链表实现
引子 所谓单向循环链表,不过是在单向链表的基础上,如响尾蛇般将其首尾相连,也因此有诸多类似之处与务必留心之点.尤其是可能涉及到头尾节点的操作,不可疏忽. 对于诸多操所必须的遍历,这时的条件是什么?又应 ...
- vue项目中引入mint-ui的方式(全部引入与按需引入)
参考哦 https://blog.csdn.net/qq_36742720/article/details/83620584 https://jingyan.baidu.com/article/c1a ...