一.前言:每次写总要说一点最近的感想

进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星期一综合征",每个星期一很没有状态。全身都有点酸痛,这个可能一个星期只有周末才打一次球有关吧。好吧还是说说正经的,厂里的牛哥昨天分配给我一个任务,大概的一个意思就是“用这个SingaIR 发送一条消息给客户端,客户端进行反馈响应”。任务听起来似乎很简单,但是没接触过SingaIR这玩意,我也是挺郁闷了一大半天,虽然之前有了解到这项目中用到用redis存储SingaIR 发送的消息,苦于没有时间去实践学习,突然想起那句话“机会永远是给有准备的人”,平时过于懒惰没有合理分配学习计划,只能临时抱佛脚,关键是还不知道从哪抱起。经过一天的探索,终于摸清了门道。
所以写了篇文章,让那些正在接触SignaIR的同学们,看了这个例子也能学会使用SingaIR。所谓的SingaIR入门教程当然肯定是能让你入门的。

二:什么是SignaIR

Asp.NET SignalR是微软为实现实时通信的一个类库。一般情况下,SignalR会使用JavaScript的长轮询(long polling)的方式来实现客户端和服务器通信,随着HTML5中WebSockets出现,SignalR也支持WebSockets通信。另外SignalR开发的程序不仅仅限制于宿主在IIS中,也可以宿主在任何应用程序,包括控制台,客户端程序和Windows服务等,另外还支持Mono,这意味着它可以实现跨平台部署在Linux环境下。

  SignalR内部有两类对象:

  1. Http持久连接(Persisten Connection)对象:用来解决长时间连接的功能。还可以由客户端主动向服务器要求数据,而服务器端不需要实现太多细节,只需要处理PersistentConnection 内所提供的五个事件:OnConnected,
    OnReconnected, OnReceived, OnError 和 OnDisconnect 即可。
  2. Hub(集线器)对象:用来解决实时(realtime)信息交换的功能,服务端可以利用URL来注册一个或多个Hub,只要连接到这个Hub,就能与所有的客户端共享发送到服务器上的信息,同时服务端可以调用客户端的脚本。SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。

SignalR将整个信息的交换封装起来,客户端和服务器都是使用JSON来沟通的,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,.NET则依赖Proxy来生成代理对象,而Proxy的内部则是将JSON转换成对象。

客户端和服务端的具体交互情况如下图所示:(看不懂此图没关系,写完例子再看就会有新的体会)

这段是抄的哦!,如果非要用一句话来说SignaIR是什么,其实就是微软自己封装好的实现即时通讯的一个类库。

三:SignaIR入门简单的例子

这才是重点,以上的介绍大家肯定对Asp.net SignaIR有了一个初步的了解,接下我们开始实践操作了。
先来看一下最终要实现的效果图吧:
1.新建一个MVC项目,我用的是Vs2015默认添加的是MVC5
2."引用" 右键点击 》管理Nuget程序包》搜索SignaIR ,添加完SignaIR 你可以在 Scripts 文件夹下看到:

3.向项目中添加一个SignaIR集线器(V2)命名为ServerHub:

4.在刚刚新建的ServerHub.cs 中写入 一下代码:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using Microsoft.AspNet.SignalR;
  6. using Microsoft.AspNet.SignalR.Hubs;
  7. using System.Data;
  8. using System.Threading.Tasks;
  9. namespace SignaIREasyDemo
  10. {
  11. public class ServerHub : Hub
  12. {
  13. public void SendMsg(string message)
  14. {
  15. //调用所有客户端的sendMessage方法
  16. Clients.All.sendMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),message);
  17. }
  18. }
  19. }

5.如果你是vs2015 的话添加的mvc项目 不进行身份验证的那种吧,必须得添加一个Startup 类.   
  如果没有这个类,请添加,不然的话项目运行不起来的,具体代码如下:

  1. using Microsoft.Owin;
  2. using Owin;
  3. [assembly: OwinStartup(typeof(SignalRQuickStart.Startup))]
  1. namespace SignalRQuickStart
  2. {
  3. public class Startup
  4. {
  5. public void Configuration(IAppBuilder app)
  6. {
  7. // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
  8. // 配置集线器
  9. app.MapSignalR();
  10. }
  11. }
  12. }

6.在Control 里新建一个Chat Action方法,在Chat视图里代码如下:

  1. @{
  2. ViewBag.title = "SignaIR聊天窗口";
  3. }
  4. <div class="container">
  5. <input type="text" id="message" />
  6. <input type="button" id="sendmessage" value="Send" />
  7. <input type="hidden" id="displayname" />
  8. <ul id="messageBox"></ul>
  9. </div>
  10. @section scripts
  11. {
  12. <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
  13. <script src="~/signalr/hubs"></script>
  14. <script>
  15. $(function () {
  16. //引用自动生成的集线器代理
  17. var chat = $.connection.serverHub;
  18. //定义服务器调用的客户端sendMessage来显示新消息
  19. chat.client.sendMessage = function (name, message)
  20. {
  21. //向页面添加消息
  22. $("#messageBox").append('<li><strong style="color:green">'+htmlEncode(name)+'</strong>:'+htmlEncode(message)+'</li>');
  23. }
  24. //设置焦点到输入框
  25. $('#message').focus();
  26. //开始连接服务器
  27. $.connection.hub.start().done(function () {
  28. $('#sendmessage').click(function () {
  29. //调用服务器端集线器的Send方法
  30. chat.server.sendMsg($('#message').val());
  31. //清空输入框信息并获取焦点
  32. $("#message").val('').focus();
  33. })
  34. })
  35. });
  36. //为显示的消息进行html编码
  37. function htmlEncode(value)
  38. {
  39. var encodeValue = $('<div/>').text(value).html();
  40. return encodeValue;
  41. }
  42. </script>
  43. }
好了,一个SignaIR 简单的入门的例子就ok了,最终的效果图在上面也已经看到了。下面我们就简单的分析一下吧
从最终的效果图 我们可以看到,在任何一个web 页面中发送的消息所有的 页面都会接收到该消息。这种应用在IM系统非常广泛常见。
当然SignaIR并不局限于这种B/S模式的消息推送,在C/S 同样也能应用,目前我们公司xamarin android所用的就是这个SingaIR实现的PC之间、PC与移动端、移动端与移动端之间的交流,使用之后会发现的确挺方便的。
有人可能感觉很郁闷了,在视图中引入 这段js有什么作用?也并有写啊。
  1. <script src="~/signalr/hubs"></script>

其实在服务器端声明的所有Hub信息,最终都会生成JavaScript输出到客户端,其实谷歌浏览器中F12 ,在Sources你就可以看到写的源代码了:

还是来看一下在这种B/S 模式中 SignaIR是如何运行的吧。首先程序开始的时候,Web页面就已经与SignaIR的服务建立连接。
$.connection.hub.start() 意思就是有signaIR服务建立连接
.done 函数表示连接成功后为发送的按钮绑定一个单击事件
发送消息的方法:chat.server.sendMsg($('#message').val())
在ServerHub重写一个 OnConnected 方法来监控客户端的连接情况,的确程序运行的时候web页面就已经开始建立连接了,在调试的时候可以在输入中看到 "客户端连接成功!"
  1. //<span style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size:12px; line-height: 24px;">重写OnConnected 方法</span>
  1. public override Task OnConnected()
  2. {
  3. System.Diagnostics.Trace.WriteLine("客户端连接成功!");
  4. return base.OnConnected();
  5. }

一个简单的如何使用SignaIR就是这么多,用法很广泛,用的人也挺多的,所以值得学习。下一步准备在Xamarin android
中也写一个聊天的例子。希望能完整一点吧。下载地址:http://download.csdn.net/detail/kebi007/9683942

作者:张林

标题:MVC中使用SignaIR入门教程 原文地址:http://blog.csdn.net/kebi007/article/details/53167003

转载随意注明出处

MVC中使用SignaIR入门教程的更多相关文章

  1. [置顶] MVC中使用signalR入门教程

    一.前言:每次写总要说一点最近的感想 进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星期一综合征",每个星期一很没有状态.全身都有点酸痛,这个可能一个星期只有周末才打一 ...

  2. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  3. EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

    在前面的教程你实施了一套基本的 CRUD 操作,为Student实体的 web 页.在本教程中,您将添加排序. 筛选和分页到 StudentsIndex的功能.您还将创建一个页面,并简单分组. 下面的 ...

  4. .NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy

    当我们要接到一个新的项目的时候,我们第一时间想到的是用微软的MVC框架,但是你是否想过微软的MVC是不是有点笨重?我们这个项目用MVC是不是有点大材小用?有没有可以替代MVC的东西呢?看到这里也许你会 ...

  5. EntityFramework_MVC4中EF5 新手入门教程之七 ---7.通过 Entity Framework 处理并发

    在以前的两个教程你对关联数据进行了操作.本教程展示如何处理并发性.您将创建工作与各Department实体的 web 页和页,编辑和删除Department实体将处理并发错误.下面的插图显示索引和删除 ...

  6. EntityFramework_MVC4中EF5 新手入门教程之六 ---6.通过 Entity Framework 更新关联数据

    在前面的教程中,您将显示相关的数据 :在本教程中,您会更新相关的数据.对于大多数的关系,这个目标是可以通过更新相应的外键字段来达到的.对于多对多关系,实体框架并不直接,暴露联接表,因此您必须显式添加和 ...

  7. EntityFramework_MVC4中EF5 新手入门教程之五 ---5.通过 Entity Framework 读取相关数据

    在前面的教程中,您完成School数据模型.在本教程中,您会读取和显示相关的数据 — — 那就是,实体框架将加载到导航属性的数据. 下面的插图显示页面,您将完成的工作. 延迟. 预先,和显式加载的相关 ...

  8. EntityFramework_MVC4中EF5 新手入门教程之四 ---4.在EF中创建更复杂的数据模型

    在以前的教程你曾与一个简单的数据模型,由三个实体组成.在本教程中,您将添加更多的实体和关系,并通过指定格式. 验证和数据库映射规则,您将自定义数据模型.你会看到自定义的数据模型的两种方式: 通过添加属 ...

  9. EntityFramework_MVC4中EF5 新手入门教程之二 ---2.执行基本的 CRUD 功能

    在前面的教程中,您创建 MVC 应用程序中,存储和显示数据使用实体框架和 SQL 服务器 LocalDB.在本教程中,您会审查和自定义的 CRUD (创建. 读取. 更新. 删除) MVC 脚手架会自 ...

随机推荐

  1. 新学C++的for,switch和随机数

    通过一个小程序学习: #include<iostream> #include<cstdlib> #include<ctime> using namespace st ...

  2. 关于EF的 序列化类型为“XXX”的对象时检测到循环引用。

    在用Ef的时候,也许经常会遇到循环引用的错误. 下面提供解决办法.(不是Json.Net,如果是Json.Net可以给导航属性通过增加特性标签来解决该问题) ef大多数问题,可以通过ToList()来 ...

  3. JS数组添加字典的方法

    var ary_RoleType = [];  //申明数组变量 for(var j = 0;j<treeData.length;j++){ if($.inArray(treeData[j].v ...

  4. c#如何采集需要登录的页面

    首先说明:代码片段是从网络获取,然后自己修改.我想好的东西应该拿来分享. 先说下原理:当我们采集页面的时候,如果被采集的网站需要登录才能采集.不管是基于Cookie还是基于Session,我们都会首先 ...

  5. [函数] Firemonkey iOS 指定目录不要备份到 iCloud

    uses iOSapi.Foundation, Macapi.Helpers; // 不要备份到 iCloud by Aone function addSkipBackupAttributeToIte ...

  6. DokuWiki用storage的模式在sae上部署后速度太慢

    利用sae做的io wrapper接口,对dokuwiki做了基于sae的分布式storage存储改造,能正常安装和运行,但速度太慢,基本没什么用. 定义一个常量: define('SAESTORE_ ...

  7. @RequestMapping映射请求

     1.SpringMVC使用@RequestMapping注解为控制器指定可以处理哪些URL请求.   2.在控制器的类定义和方法定义处都可标注@RequestMapping   2.1 类定义处:提 ...

  8. 【LeetCode】389 Find the Difference(java)

    原题 Given two strings s and t which consist of only lowercase letters. String t is generated by rando ...

  9. go语言最新版本 下载地址

    国内官方网站无法打开.放在了百度云中,定期会更新: 链接:http://pan.baidu.com/s/1dD59duh 密码:46ek 备用地址:http://pan.baidu.com/s/1hq ...

  10. VS2012 asp.net mvc 4 运行项目提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败"

    创建mvc4 应用程序发布,运行出错.出现未经授权: 服务器配置导致登录失败.请验证您是否有权基于您提供的凭,后来找得解决方法: 打开点站的web.confg文件,将: <authorizati ...