0

0

Asp.net SignalR快速入门

高洛峰

高洛峰

发布时间:2016-12-24 14:27:00

|

1847人浏览过

|

来源于php中文网

原创

今天的专题就是让大家可以快速的上手asp.net signalr。废话不多说了,下面正式进入今天专题的内容。

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

  SignalR内部有两类对象:

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

  客户端和服务端的具体交互情况如下图所示:

Asp.net SignalR

  从上面的介绍可以看出,SignalR既然是为实时而生的,这样就决定了其使用场所。具体适用情景有如下几点:

1、聊天室,如在线客服系统,IM系统等
2、股票价格实时更新
3、消息的推送服务
4、游戏中人物位置的实时推送
   目前,我所在公司在开发的就是在线客服系统。

三、使用Asp.net SignalR在Web端实现广播消息
   通过第二部分的介绍,相信大家对Asp.net SignalR有了一个初步的了解,接下来通过两个例子来让大家加深对SignalR运行机制的理解。第一个例子就是在Web端如何使用SignalR来实现广播消息。

使用Visual Studio 2013,创建一个MVC工程
通过Nuget安装SignalR包。右键引用-》选择管理Nuget程序包-》在出现的窗口中输入SignalR来找到SignalR包进行安装。
安装SignalR成功后,SignalR库的脚本将被添加进Scripts文件夹下。具体如下图所示:

Asp.net SignalR

4. 向项目中添加一个SignalR集线器(v2)并命名为ServerHub。

Asp.net SignalR

  5. 将下面代码填充到刚刚创建的ServerHub类中。

using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System;
 
namespace SignalRQuickStart
{public class ServerHub : Hub
  {
    private static readonly char[] Constant =
    {
      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
      'w', 'x', 'y', 'z',
      'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
      'W', 'X', 'Y', 'Z'
    };
 
    /// 
    /// 供客户端调用的服务器端代码
    /// 
    /// 
    public void Send(string message)
    {
      var name = GenerateRandomName(4);
 
      // 调用所有客户端的sendMessage方法
      Clients.All.sendMessage(name, message);
    }
 
    /// 
    /// 产生随机用户名函数
    /// 
    /// 用户名长度
    /// 
    public static string GenerateRandomName(int length)
    {
      var newRandom = new System.Text.StringBuilder(62);
      var rd = new Random();
      for (var i = 0; i < length; i++)
      {
        newRandom.Append(Constant[rd.Next(62)]);
      }
      return newRandom.ToString();
    }
  }
}

   

  6. 创建一个Startup类,如果开始创建MVC项目的时候没有更改身份验证的话,这个类会默认添加的,如果已有就不需要重复添加了。按照如下代码更新Startup类。

  7. 在Home控制器中创建一个Home Action方法

public class HomeController : Controller
  {
    public ActionResult Index()
    {
      return View();
    }
 
    public ActionResult About()
    {
      ViewBag.Message = "Your application description page.";
 
      return View();
    }
 
    public ActionResult Contact()
    {
      ViewBag.Message = "Your contact page.";
 
      return View();
    }
 
    public ActionResult Chat()
    {
      return View();
    }
  }

   

  8. 在Views文件中Home文件夹中创建一个Chat视图,视图代码如下所示:

@{
  ViewBag.Title = "聊天窗口";
}
 

Chat

    @section scripts { }

       

      9. 修改App_Start文件夹内的RoutConfig类,将Action方法默认设置为Chat.

    public class RouteConfig
      {
        public static void RegisterRoutes(RouteCollection routes)
        {
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
          routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Chat", id = UrlParameter.Optional }
          );
        }
      }

       

      到此,我们的例子就实现完成了,接下来我们先来看看运行效果,之后再来解释到底SignalR是如何来完成广播消息的。运行的运行结果如下。

    Asp.net SignalR

    DM建站系统汽车保养维修HTML5网站模板1.5
    DM建站系统汽车保养维修HTML5网站模板1.5

    DM建站系统汽车保养维修HTML5网站模板,DM企业建站系统。是由php+mysql开发的一套专门用于中小企业网站建设的开源cms。DM系统的理念就是组装,把模板和区块组装起来,产生不同的网站效果。可以用来快速建设一个响应式的企业网站( PC,手机,微信都可以访问)。后台操作简单,维护方便。DM企业建站系统安装步骤:第一步,先用phpmyadmin导入sql文件。 第二步:把文件放到你的本地服务器

    下载

      从运行结果,你可以发现,在任何一个窗口输入信息并发送,所有客户端将收到该消息。这样的效果在实际应用中很多,如QQ,一登录QQ的时候都会推送腾讯广告消息。

      看完了运行结果,接下来我们来分析下代码,进而来剖析下SignalR到底是如何工作的。

      按照B/S模式来看,运行程序的时候,Web页面就与SignalR的服务建立了连接,具体的建立连接的代码就是:$.connection.hub.start()。这句代码的作用就是与SignalR服务建立连接,后面的done函数表明建立连接成功后为发送按钮注册了一个click事件,当客户端输入内容点击发送按钮后,该Click事件将会触发,触发执行的操作为: chat.server.send($('#message').val())。这句代码表示调用服务端的send函数,而服务端的Send韩式又是调用所有客户端的sendMessage函数,而客户端中sendMessage函数就是将信息添加到对应的消息列表中。这样就实现了广播消息的功能了。

      看到这里,有人是否会有疑问,前面的实现都只用到了集线器对象,而没有用到持久连接对象。其实并不是如此,$.connection这句代码就是使用持久连接对象,当然你也可以在重新OnConnected方法来查看监控客户端的连接情况,更新的代码如下所示:

    public class ServerHub : Hub
     {
       private static readonly char[] Constant =
       {
         '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
         'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
         'w', 'x', 'y', 'z',
         'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
         'W', 'X', 'Y', 'Z'
       };
     
       /// 
       /// 供客户端调用的服务器端代码
       /// 
       /// 
       public void Send(string message)
       {
         var name = GenerateRandomName(4);
     
         // 调用所有客户端的sendMessage方法
         Clients.All.sendMessage(name, message);
       }
     
       /// 
       /// 客户端连接的时候调用
       /// 
       /// 
       public override Task OnConnected()
       {
         Trace.WriteLine("客户端连接成功");
         return base.OnConnected();
       }
     
       /// 
       /// 产生随机用户名函数
       /// 
       /// 用户名长度
       /// 
       public static string GenerateRandomName(int length)
       {
         var newRandom = new System.Text.StringBuilder(62);
         var rd = new Random();
         for (var i = 0; i < length; i++)
         {
           newRandom.Append(Constant[rd.Next(62)]);
         }
         return newRandom.ToString();
       }
     }

       

      这样在运行页面的时候,将在输出窗口看到“客户端连接成功”字样。运行效果如下图所示:

    Asp.net SignalR

      在第二部分介绍的时候说道,在服务端声明的所有Hub信息,都会生成JavaScript输出到客户端,为了验证这一点,可以在Chrome中F12来查看源码就明白了,具体如下图所示:

    Asp.net SignalR

     看到上图,你也就明白了为什么Chat.cshtml页面需要引入"signalr/hubs"脚本库了吧。

    
      
       
      

       

    四、在桌面程序中如何使用Asp.net SignalR
       上面部分介绍了SignalR在Asp.net MVC 中的实现,这部分将通过一个例子来看看SignalR在WPF或WinForm是如何使用的。其实这部分实现和Asp.net MVC中非常相似,主要不同在于,Asp.net MVC中的SignalR服务器寄宿在IIS中,而在WPF中应用,我们把SignalR寄宿在WPF客户端中。

    下面让我们看看SignalR服务端的实现。

    /// 
        /// 启动SignalR服务,将SignalR服务寄宿在WPF程序中
        /// 
        private void StartServer()
        {
          try
          {
            SignalR = WebApp.Start(ServerUri); // 启动SignalR服务
          }
          catch (TargetInvocationException)
          {
            WriteToConsole("一个服务已经运行在:" + ServerUri);
            // Dispatcher回调来设置UI控件状态
            this.Dispatcher.Invoke(() => ButtonStart.IsEnabled = true);
            return;
          }
     
          this.Dispatcher.Invoke(() => ButtonStop.IsEnabled = true);
          WriteToConsole("服务已经成功启动,地址为:" + ServerUri);
        }
     
    public class ChatHub : Hub
      {
        public void Send(string name, string message)
        {
          Clients.All.addMessage(name, message);
        }
     
        public override Task OnConnected()
        {
          //
          Application.Current.Dispatcher.Invoke(() =>
            ((MainWindow)Application.Current.MainWindow).WriteToConsole("客户端连接,连接ID是: " + Context.ConnectionId));
     
          return base.OnConnected();
        }
     
        public override Task OnDisconnected(bool stopCalled)
        {
           Application.Current.Dispatcher.Invoke(() =>
            ((MainWindow)Application.Current.MainWindow).WriteToConsole("客户端断开连接,连接ID是: " + Context.ConnectionId));
     
          return base.OnDisconnected(true);
        }
      }
     
     public class Startup
      {
        public void Configuration(IAppBuilder app)
        {
          // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
          // 允许CORS跨域
          //app.UseCors(CorsOptions.AllowAll);
          app.MapSignalR();
        }
      }

       

      通过上面的代码,我们SignalR服务端的实现就完成了,其实现逻辑与Asp.net MVC的代码类似。

      接下来,让我们看看,WPF客户端是如何连接和与服务器进行通信的。具体客户端的实现如下:

    public IHubProxy HubProxy { get; set; }
       const string ServerUri = "http://localhost:8888/signalr";
       public HubConnection Connection { get; set; }
     
       public MainWindow()
       {
         InitializeComponent();
     
         // 窗口启动时开始连接服务
         ConnectAsync();
       }
     
       /// 
       /// 发送消息
       /// 
       /// 
       /// 
       private void ButtonSend_Click(object sender, RoutedEventArgs e)
       {
         // 通过代理来调用服务端的Send方法
         // 服务端Send方法再调用客户端的AddMessage方法将消息输出到消息框中
         HubProxy.Invoke("Send", GenerateRandomName(4), TextBoxMessage.Text.Trim());
     
         TextBoxMessage.Text = String.Empty;
         TextBoxMessage.Focus();
       }
     
       private async void ConnectAsync()
       {
         Connection = new HubConnection(ServerUri);
         Connection.Closed += Connection_Closed;
     
         // 创建一个集线器代理对象
         HubProxy = Connection.CreateHubProxy("ChatHub");
     
         // 供服务端调用,将消息输出到消息列表框中
         HubProxy.On("AddMessage", (name, message) =>
            this.Dispatcher.Invoke(() =>
             RichTextBoxConsole.AppendText(String.Format("{0}: {1}\r", name, message))
           ));
     
         try
         {
           await Connection.Start();
         }
         catch (HttpRequestException)
         {
           // 连接失败
           return;
         }
     
         // 显示聊天控件
         ChatPanel.Visibility = Visibility.Visible;
         ButtonSend.IsEnabled = true;
         TextBoxMessage.Focus();
         RichTextBoxConsole.AppendText("连上服务:" + ServerUri + "\r");
       }

       

      上面的代码也就是WPF客户端实现的核心代码,主要逻辑为,客户端启动的时候就调用Connection.Start方法与服务器进行连接。然后通过HubProxy代理类来调用集线器中Send方法,而集线器中的Send方法又通过调用客户端的addMessage方法将消息输出到客户端的消息框中进行显示,从而完成消息的推送过程。接下来,让我们看看其运行效果:

    Asp.net SignalR

       从上面的运行效果看出,其效果和Asp.net MVC上的效果是一样的。

    五、总结
       到这里,本专题的所有内容就结束了,这篇SignalR快速入门也是本人在学习SignalR过程中的一些心得体会,希望可以帮助一些刚接触SignalR的朋友快速入门。本篇主要实现了SignalR的广播消息的功能,可以实现手机端消息推送的功能,接下来一篇将介绍如何使用SignalR实现一对一的聊天。

    更多Asp.net SignalR快速入门相关文章请关注PHP中文网!

    相关专题

    更多
    Golang gRPC 服务开发与Protobuf实战
    Golang gRPC 服务开发与Protobuf实战

    本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

    0

    2026.01.15

    公务员递补名单公布时间 公务员递补要求
    公务员递补名单公布时间 公务员递补要求

    公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

    2

    2026.01.15

    公务员调剂条件 2026调剂公告时间
    公务员调剂条件 2026调剂公告时间

    (一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

    10

    2026.01.15

    国考成绩查询入口 国考分数公布时间2026
    国考成绩查询入口 国考分数公布时间2026

    笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

    2

    2026.01.15

    Java 桌面应用开发(JavaFX 实战)
    Java 桌面应用开发(JavaFX 实战)

    本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

    63

    2026.01.14

    php与html混编教程大全
    php与html混编教程大全

    本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

    32

    2026.01.13

    PHP 高性能
    PHP 高性能

    本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

    73

    2026.01.13

    MySQL数据库报错常见问题及解决方法大全
    MySQL数据库报错常见问题及解决方法大全

    本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

    20

    2026.01.13

    PHP 文件上传
    PHP 文件上传

    本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

    25

    2026.01.13

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    ASP.NET参考手册
    ASP.NET参考手册

    共0课时 | 0人学习

    传播智客ASP.NET中级系列视频教程
    传播智客ASP.NET中级系列视频教程

    共33课时 | 6.3万人学习

    传播智客ASP.NET高级系列视频教程
    传播智客ASP.NET高级系列视频教程

    共34课时 | 6.2万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号