何为ASP.NET SignalR,有什么用

ASP.NET SignalR是一个ASP.NET库,是为了实现实时web通信而创造的,能让服务器与客户端实现即时通信,而不需要服务器等待接收到客户端请求才能返回内容。简言之,就是可以实现服务端主动给客户端发送请求。

ASP.NET SignalR的依赖环境

  • Windows 7&8 或 Windows Server 2008 R2 & Windows 2012
  • IIS 8 + & 集成模式
  • .NET FRAMEWOKR 4.5 +
  • 支持websocket的浏览器

实际上,ASP.NET SignalR请求是基于http的,在不支持websocket的环境下,会自动降级到Comet模式(即Forever Frame/Ajax long polling)兼容旧版本客户端

ASP.NET SignalR的两种通信模型

1、Persistent connection 持久性连接

Persistent Connections表示一个发送单个,编组,广播信息的简单终结点。开发人员通过使用持久性连接Api,直接访问SignalR公开的底层通信协议

2、Hub 集线器

Hubs是基于连接Api的更高级别的通信管道,它允许客户端和服务器上彼此直接调用方法,SignalR能够很神奇地处理跨机器的调度,使得客户端和服务器端能够轻松调用在对方端上的方法。使用Hub还允许开发人员将强类型的参数传递给方法并绑定模型

讲了那么多废话,下面就演示两种不同通信模型的实例吧

准备条件

1、使用Visual Studio 2015,创建一个默认的ASP.NET MVC项目

2、安装ASP.NET SignalR,在nuget power shell中执行

  1. Install-Package Microsoft.AspNet.SignalR

3、添加SignalR服务,添加->新建项->Visual C#/Web/SignalR,便可看到两种不同的通信模型

4、在根目录下面新建Connections文件夹

Persistent Connections演示实例

1、在Connections文件下,添加->新建项->Visual C#/Web/SignalR,选择SignalR永久连接类(v2)

  1. public class ChatConnection : PersistentConnection
  2. {
  3. protected override Task OnConnected(IRequest request, string connectionId)
  4. {
  5. return Connection.Send(connectionId, "Welcome!");
  6. }
  7.  
  8. protected override Task OnReceived(IRequest request, string connectionId, string data)
  9. {
  10. return Connection.Broadcast(data);
  11. }
  12. }

2、在根目录下找到Startup.cs

  1. public partial class Startup
  2. {
  3. public void Configuration(IAppBuilder app)
  4. {
  5. ConfigureAuth(app);
  6. app.MapSignalR<ChatConnection>("/Connections/ChatConnection");
  7. }
  8. }

3、在HomeController.cs

  1. public ActionResult PersistentConnection()
  2. {
  3. return View();
  4. }

4、新建PersistentConnection.cshtml

  1. @{
  2. Layout = null;
  3. }
  4.  
  5. <!DOCTYPE html>
  6.  
  7. <html>
  8. <head>
  9. <meta name="viewport" content="width=device-width" />
  10. <title>PersistentConnection</title>
  11. <script src="~/Scripts/jquery-1.10.2.min.js"></script>
  12. <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
  13. <script type="text/javascript">
  14. $(function () {
  15.  
  16. // 声明PersistentConnection连接
  17. var connection = $.connection("/Connections/ChatConnection");
  18.  
  19. $('#displayname').val(prompt('Enter your name:', ''));
  20. $("msg").focus();
  21.  
  22. // 接收内容
  23. connection.received(function (data) {
  24. $('#messages').append('<li>' + data + '</li>');
  25. });
  26.  
  27. // 开启连接
  28. connection.start().done(function () {
  29. $("#broadcast").click(function () {
  30.  
  31. // 发送内容
  32. connection.send($('#displayname').val() + ':' + $('#msg').val());
  33. });
  34. });
  35.  
  36. });
  37. </script>
  38. </head>
  39. <body>
  40. <input type="text" id="msg" />
  41. <input type="button" id="broadcast" value="broadcast" />
  42. <input type="hidden" id="displayname" />
  43. <ul id="messages"></ul>
  44. </body>
  45. </html>

5、在Chrome中运行

Hubs演示实例(图片就不贴了,基本与Persistent Connections一样)

1、在Connections文件下,添加->新建项->Visual C#/Web/SignalR,选择SignalR集线器类(v2)

  1. public class ChatHub : Hub
  2. {
  3. public void Send(string name, string message)
  4. {
  5. // 回调客户端函数,这里与客户端
  6. Clients.All.broadcastMessage(name, message);
  7. }
  8. }

2、在根目录下找到Startup.cs

  1. public void Configuration(IAppBuilder app)
  2. {
  3. ConfigureAuth(app);
  4. app.MapSignalR();
  5. }

3、在HomeController.cs

  1. public ActionResult Hub()
  2. {
  3. return View();
  4. }

4、并新建Hub.cshtml

  1. @{
  2. Layout = null;
  3. }
  4.  
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <title>Hub</title>
  9. <style type="text/css">
  10. .container {
  11. background-color: #99CCFF;
  12. border: thick solid #808080;
  13. padding: 20px;
  14. margin: 20px;
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <div class="container">
  20. <input type="text" id="message" />
  21. <input type="button" id="sendmessage" value="Send" />
  22. <input type="hidden" id="displayname" />
  23. <ul id="discussion"></ul>
  24. </div>
  25. <!-- 引用jquery -->
  26. <script src="/Scripts/jquery-1.10.2.min.js"></script>
  27. <!-- 引用SignalR -->
  28. <script src="/Scripts/jquery.signalR-2.2.1.min.js"></script>
  29. <!-- 声明自动生成hub脚本路径 -->
  30. <script src="/signalr/hubs"></script>
  31.  
  32. <script type="text/javascript">
  33. $(function () {
  34. // 声明hub代理,首字母需小写,与hub类名对应(也可使用别名)
  35. var chat = $.connection.chatHub;
  36.  
  37. // 服务端回调函数,与hub类中Clients.All.broadcastMessage(name, message)对应
  38. chat.client.broadcastMessage = function (name, message) {
  39. // Html encode display name and message.
  40. var encodedName = $('<div />').text(name).html();
  41. var encodedMsg = $('<div />').text(message).html();
  42. // Add the message to the page.
  43. $('#discussion').append('<li><strong>' + encodedName
  44. + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
  45. };
  46.  
  47. $('#displayname').val(prompt('Enter your name:', ''));
  48. $('#message').focus();
  49.  
  50. // 开启hub连接
  51. $.connection.hub.start().done(function () {
  52. $('#sendmessage').click(function () {
  53.  
  54. // 发送内容至hub服务端,与public void Send(string name, string message)对应
  55. chat.server.send($('#displayname').val(), $('#message').val());
  56.  
  57. $('#message').val('').focus();
  58. });
  59. });
  60. });
  61. </script>
  62. </body>
  63. </html>

5、运行

到此,ASP.NET SignalR介绍完毕

ASP.NET SignalR的更多相关文章

  1. ASP.NET SignalR入门

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

  2. ASP.NET SignalR 高可用设计

    在 One ASP.NET 的架构图中,微软将 WebAPI 和 SignalR 归类到 Services 类型与 MVC.Web Forms 同列为一等公民,未来的 ASP.NET 5 尽管还在be ...

  3. csharp:ASP.NET SignalR

    http://signalr.net/ https://github.com/SignalR/SignalR http://www.asp.net/signalr http://www.cnblogs ...

  4. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列

    ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言  http://www.cnblogs.com/panzi/p/5742089.html ASP.NET S ...

  5. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换

    前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...

  6. [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门

    一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到SignalR技术,所以打算总结下Asp.net ...

  7. 《ASP.NET SignalR系列》第五课 在MVC中使用SignalR

    接着上一篇:<ASP.NET SignalR系列>第四课 SignalR自托管(不用IIS) 一.概述 本教程主要阐释了如何在MVC下使用ASP.NET SignalR. 添加Signal ...

  8. 《ASP.NET SignalR系列》第四课 SignalR自托管(不用IIS)

    从现在开始相关文章请到: http://lko2o.com/moon 接着上一篇:<ASP.NET SignalR系列>第三课 SignalR的支持平台 一.概述 SignalR常常依托于 ...

  9. 《ASP.NET SignalR系列》第三课 SignalR的支持平台

    从现在开始相关文章请到: http://lko2o.com/moon 接着第二课:<ASP.NET SignalR系列>第二课 SignalR的使用说明 一.服务器系统要求 SignalR ...

随机推荐

  1. 浅析String不可变性

    在所有编程语言领域,我想字符串应该是地球上最常用的表达手段了吧. 在java的世界里,String是作为类出现的,核心的一个域就是一个char数组,内部就是通过维护一个不可变的char数组,来向外部输 ...

  2. iOS 视图控制器 (内容根据iOS编程编写)

    视图控制器是  UIViewController 类或其子类对象.每个视图控制器都负责管理一个视图层次结构,包括创建视图层级结构中的视图并处理相关用户事件,以及将整个视图层次结构添加到应用窗口. 创建 ...

  3. Nancy之Forms authentication的简单使用

    一.前言 想必大家或多或少都听过微软推出的ASP.NET Identity技术,可以简单的认为就是一种授权的实现 很巧的是,Nancy中也有与之相类似的技术Authentication,这两者之间都用 ...

  4. Get和Post区别

    1. get是从服务器上获取数据,post是向服务器传送数据.2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过H ...

  5. 在公有云AZURE上部署私有云AZUREPACK以及WEBSITE CLOUD(一)

    (一)前言 本文主要介绍了实践部署AzurePack的Website Cloud的过程.在部署之前, 首先要对AzurePack有个基本的了解.   Azure Pack是微软的私有云方案,具有弹性. ...

  6. android应用开发(十):widget的使用

    1.自定义widget必须继承AppWidgetProvider 源码:http://www.jinhusns.com/Products/Download/?type=xcj 2.AndroidMan ...

  7. 使用abp模板创建解决方案

    前言 ABP官网(http://www.aspnetboilerplate.com/),本地环境 sql server EXPRESS +vs2013 通过官网生成 module zero 解决方案模 ...

  8. 背水一战 Windows 10 (30) - 控件(文本类): AutoSuggestBox

    [源码下载] 背水一战 Windows 10 (30) - 控件(文本类): AutoSuggestBox 作者:webabcd 介绍背水一战 Windows 10 之 控件(文本类) AutoSug ...

  9. C++构造函数中不能调用虚函数

    在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造 ...

  10. 数据集转换为Json

    数据集转换为Json 第一步:新建一个类对象  通常我会写三个属性:状态.返回信息.数据集 第二步:新建一个JSON转换类 第三步:把类对象当做参数传入JSON转换类 ———————————————— ...