持久连接类

通过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 - 持久连接类的更多相关文章

  1. ASP.NET SignalR2持久连接层解析

    越是到年底越是感觉浑身无力,看着啥也不想动,只期盼着年终奖的到来以此来给自己打一针强心剂.估摸着大多数人都跟我一样犯着这样浑身无力的病,感觉今年算是没挣到啥钱,但是话也不能这么说,搞得好像去年挣到钱了 ...

  2. 一、ASP.NET Iframework_SignalR永久连接类(v2)

    一.新建项目,选MVC项目默认 添加mvc文件夹和核心引用 二.添加SignaIR包 SignalR的准备:NuGet包管理器搜索:工具——>库程序包管理器——>Microsoft.Asp ...

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

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

  4. 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式

    1.概述 通过上篇史上最全面的SignalR系列教程-1.认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解.本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然 ...

  5. Asp.Net SignalR Hub类中的操作详解

    Hub类中的操作 在服务端我们要通过Hub类做一系列操作,下面就说说我们都可以做什么操作 客户端的发送消息操作 调用所有的客户端的helloClient方法 Clients.All.helloClie ...

  6. ASP.NET SignalR入门

    前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...

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

    一:背景 我们知道传统的http采用的是“拉模型”,也就是每次请求,每次断开这种短请求模式,这种场景下,client是老大,server就像一个小乌龟任人摆布, 很显然,只有一方主动,这事情就没那么完 ...

  8. ASP.NET SignalR

    何为ASP.NET SignalR,有什么用 ASP.NET SignalR是一个ASP.NET库,是为了实现实时web通信而创造的,能让服务器与客户端实现即时通信,而不需要服务器等待接收到客户端请求 ...

  9. Asp.Net SignalR Hub中的上下文对象

    Hub中的 Context 使用了集线器后,会发现对比持久连接类少了OnConnectioned这样的事件,事实上是有的.需要我们去override .这下似乎发现了什么问题,记得持久连接类中有con ...

随机推荐

  1. 数据分析 大数据之路 五 pandas 报表

    pandas:  在内存中或对象,会有一套基于对象属性的方法,   可以视为 pandas 是一个存储一维表,二维表,三维表的工具, 主要以二维表为主 一维的表, (系列(Series)) 二维的表, ...

  2. vue定义全局组件

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...

  3. BFS —— 信息学一本通(1451:棋盘游戏)

    题目描述 在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的.移动棋子的规则是交换相邻两个棋子.现在给出一个初始棋盘和一个最终棋盘,要求你找出一个最短的移动序 ...

  4. 虚拟机下Ubuntu扩容及磁盘重新分区-Gparted

    转自: https://blog.csdn.net/timsley/article/details/50742755

  5. java课程之团队开发冲刺阶段1.6

    一.总结昨天进度 1.依照视频学习了sqlite,但是由于视频的不完整性导致并不知道代码的实际效果怎么样. 二.遇到的问题 1.依据上一条,在date目录下date文件夹中,的确发现了数据库的文件,但 ...

  6. maven的安装及配置

    学习的目标 1.能够掌握Maven的安装 2.能够配置Maven仓库 3.理解Maven的依赖传递 4.能够掌握Maven工程的创建 准备工作 1.需要的资料(apache-maven-3.5.2,本 ...

  7. conda 查看已有环境

    conda info -e # conda environments: # dlcv /Users/enzhao/suanec/libs/anaconda2/envs/dlcv py36 /Users ...

  8. 判断以xx开头的字符串

    public static void main(String[] args) { String str = "EAN_13,1534651"; String strHttp = & ...

  9. React Native组件、生命周期及属性传值props详解

    创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...

  10. 【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证

    系列目录 一.  创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...