MVC中使用signalR入门教程

小编 2026-07-02 阅读:976 评论:0
一.前言:每次写总要说一点最近的感想进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星...

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

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

二:什么是signalR

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转换成对象。

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

MVC中使用signalR入门教程


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

三:SignaIR入门简单的例子

这才是重点,以上的介绍大家肯定对Asp.net signalR有了一个初步的了解,接下我们开始实践操作了。
先来看一下最终要实现的效果图吧:
MVC中使用signalR入门教程
1.新建一个MVC项目,我用的是Vs2015默认添加的是MVC5
2."引用" 右键点击 》管理Nuget程序包》搜索signalR,添加完signalR你可以在 Scripts 文件夹下看到:
MVC中使用signalR入门教程
3.向项目中添加一个signalR集线器(V2)命名为ServerHub:
MVC中使用signalR入门教程
4.在刚刚新建的ServerHub.cs 中写入 一下代码:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using Microsoft.AspNet.SignalR;using Microsoft.AspNet.SignalR.Hubs;using System.Data;using System.Threading.Tasks;namespace SignaIREasyDemo{    public class ServerHub : Hub    {        public void SendMsg(string message)        {            //调用所有客户端的sendMessage方法            Clients.All.sendMessage(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),message);        }    }}
5.如果你是vs2015 的话添加的mvc项目 不进行身份验证的那种吧,必须得添加一个Startup 类.      如果没有这个类,请添加,不然的话项目运行不起来的,具体代码如下:
using Microsoft.Owin;using Owin;[assembly: OwinStartup(typeof(SignalRQuickStart.Startup))]
namespace SignalRQuickStart{    public class Startup    {        public void Configuration(IAppBuilder app)        {            // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888            // 配置集线器            app.MapSignalR();        }    }}

6.在Control 里新建一个Chat Action方法,在Chat视图里代码如下:
@{    ViewBag.title = "SignaIR聊天窗口";}    <div class="container">        <input type="text" id="message" />        <input type="button" id="sendmessage" value="Send" />        <input type="hidden" id="displayname" />        <ul id="messageBox"></ul>    </div>@section scripts{   <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>   <script src="~/signalr/hubs"></script>    <script>        $(function () {            //引用自动生成的集线器代理            var chat = $.connection.serverHub;             //定义服务器调用的客户端sendMessage来显示新消息            chat.client.sendMessage = function (name, message)            {                //向页面添加消息                $("#messageBox").append('<li><strong style="color:green">'+htmlEncode(name)+'</strong>:'+htmlEncode(message)+'</li>');            }            //设置焦点到输入框            $('#message').focus();            //开始连接服务器            $.connection.hub.start().done(function () {                $('#sendmessage').click(function () {                    //调用服务器端集线器的Send方法                    chat.server.sendMsg($('#message').val());                    //清空输入框信息并获取焦点                    $("#message").val('').focus();                })            })        });        //为显示的消息进行html编码        function htmlEncode(value)        {            var encodeValue = $('<div/>').text(value).html();            return encodeValue;        }    </script>}
好了,一个signalR简单的入门的例子就ok了,最终的效果图在上面也已经看到了。下面我们就简单的分析一下吧
从最终的效果图 我们可以看到,在任何一个web 页面中发送的消息所有的 页面都会接收到该消息。这种应用在IM系统非常广泛常见。
当然signalR并不局限于这种B/S模式的消息推送,在C/S 同样也能应用,目前我们公司xamarin android所用的就是这个signalR实现的PC之间、PC与移动端、移动端与移动端之间的交流,使用之后会发现的确挺方便的。
有人可能感觉很郁闷了,在视图中引入 这段js有什么作用?也并有写啊。
注意!,这是虚拟目录,也就是你在OWIN Startup中注册的地址
<script src="~/signalr/hubs"></script>
其实在服务器端声明的所有Hub信息,最终都会生成JavaScript输出到客户端,其实谷歌浏览器中F12 ,在Sources你就可以看到写的源代码了:
MVC中使用signalR入门教程
还是来看一下在这种B/S 模式中 signalR是如何运行的吧。首先程序开始的时候,Web页面就已经与signalR的服务建立连接。
$.connection.hub.start() 意思就是有signalR服务建立连接
.done 函数表示连接成功后为发送的按钮绑定一个单击事件
发送消息的方法:chat.server.sendMsg($('#message').val())
在ServerHub重写一个 OnConnected 方法来监控客户端的连接情况,的确程序运行的时候web页面就已经开始建立连接了,在调试的时候可以在输入中看到 "客户端连接成功!"

       //重写OnConnected 方法
      public override Task OnConnected()        {            System.Diagnostics.Trace.WriteLine("客户端连接成功!");            return base.OnConnected();        }

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

作者:张林

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

转载随意注明出处


版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表