持久连接类

通过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. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

  2. vue实现二级联动效果

    你如城市与省份间的二级联动效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  3. c++编译错误C2971:"std::array":array_size:包含非静态存储不能用作废类型参数;参见“std::array”的声明

    在Qt5中这段代码编写有两种方式:一个编译成功,一个失败 成功版本: static constexpr size_t block_size = 0x2000;//8KB static constexp ...

  4. Javaweb-request与response

                           Javaweb-request与response              Servlet   生命周期(什么时候创建的,什么时候销毁的);     Se ...

  5. Pyinstaller (python打包为exe文件)

    需求分析: python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件,降低脚本对环境的依赖性,同时运行更加迅速. 当然打包的脚本似乎不是在所有的win平台下都能使用,wi ...

  6. 使用ANY和ALL条件

    在比较运算符中,可以出现ALL和ANY,表示“全部”和“任一”,但是ALL和ANY不能单独使用,需要配合单行比较操作符>.>=.<.<=一起使用.其中: > ANY : ...

  7. Get API

    根据索引.类型和ID获取文档 GET twitter/_doc/1 返回结果如下: { "_index": "twitter", "_type&quo ...

  8. Live2D插件--漂浮的二次元小姐姐

    这个插件找了很久,都没找到,今天偶然翻到一个小哥的博客发现了这个,果断偷走. 教程转自简书:https://www.jianshu.com/p/1cedcf183633 还有这些,你可能有用 修改位置 ...

  9. python语法_内置函数

    a = filter(函数名,序列) 返回一个迭代器对象/.函数里必须加过滤条件 ret = ['a','b','c','d','e'] def ft(s): if s != 'a': return ...

  10. JMeter 测试 ActiveMq

    JMeter 测试 ActiveMq 的资料非常少, 我花了大量的时间才研究出来 关于ActiveMq 的文章请参考我另外的文章. 阅读目录 版本号: ActiveMq 版本号:  5.91 Jmet ...