zoukankan      html  css  js  c++  java
  • signalR 消息推送

    业务情景一:上传报表,上传excel。如果excel的数据量很大,上万条,上十万条数据,那么这个上传请求必然是个耗时请求。用户上传之后,很关心上传的进度和结果。

    业务情景二:站内消息提醒,实时有效地接受消息。

    对于这些需求,第一时间想到的是,前端定时去轮询数据,返回一个进度或者未读的站内消息。

    这样虽然能达到目的,但是付出的代价是昂贵的。站点24小时,不断地在请求接口,数据库不断地在被访问,这是客户端主动请求所带来的弊端。

    换一个角度,如果是服务端主动去推送消息给客户端,那么性能势必能大幅增加,同时推送的消息更为及时、准确。

    SignalR对常用实时通讯技术进行了封装, SignalR当WebSocket可用时优先使用新式的WebSocket传输,同时也兼容老式的传输。

    SignalR支持以一种简单的API来创建服务器到客户端的远程调用客户端的Javascript方法,SignalR还包括用于用于连接管理的API和分组连接。

    新建一个.net core console程序,引入nuget包

    以下是服务端代码,主程序创建了一个站内,站点启动时注入了一个hubcontext的实例,这个hubcontext的主要工作是,每隔一秒钟触发客户端去执行OnReportPublished方法。

     1 using Microsoft.AspNetCore;
     2 using Microsoft.AspNetCore.Builder;
     3 using Microsoft.AspNetCore.Hosting;
     4 using Microsoft.AspNetCore.SignalR;
     5 using Microsoft.Extensions.DependencyInjection;
     6 using System;
     7 using System.Threading;
     8 using System.Threading.Tasks;
     9 
    10 namespace OneCode.SignalR
    11 {
    12     public class Program
    13     {
    14         public static void Main(string[] args)
    15         {
    16             BuildWebHost(args).Run();
    17         }
    18 
    19         public static IWebHost BuildWebHost(string[] args) =>
    20             WebHost.CreateDefaultBuilder(args)
    21                 .UseStartup<Startup>()
    22                 .Build();
    23     }
    24 
    25     public class MyHub : Hub
    26     {
    27         //此方法用于被客户端调用,当客户端执行 hubConnection.invoke('PublishReport', $('#reportName').val()); 会触发此方法执行
    28         public Task PublishReport(string reportName)
    29         {
    30             //主动通知客户端去执行客户端本身的方法,此代码执行后
    31             //hubConnection.on('OnReportPublished', data => {
    32             //    $('#reports').append($('<li>').text(data));
    33             //});
    34 
    35             //客户端将执行 OnReportPublished
    36             return Clients.All.InvokeAsync("OnReportPublished", reportName);
    37         }
    38 
    39         public async void Echo(string sendMan)
    40         {
    41             while (true)
    42             {
    43                 await Clients.All.InvokeAsync("OnReportPublished", $"{DateTime.Now}:{sendMan}:{ Guid.NewGuid().ToString()}");
    44                 Thread.Sleep(1 * 1000);
    45             }
    46         }
    47     }
    48 
    49     public class Startup
    50     {
    51         public void ConfigureServices(IServiceCollection services)
    52         {
    53             services.AddCors(options =>
    54             {
    55                 options.AddPolicy("fiver",
    56                     policy => policy.AllowAnyOrigin()
    57                                     .AllowAnyHeader()
    58                                     .AllowAnyMethod());
    59             });
    60 
    61             services.AddSignalR(); // <-- SignalR
    62 
    63         }
    64 
    65         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    66         {
    67             app.UseDeveloperExceptionPage();
    68             app.UseCors("fiver");
    69 
    70             app.UseSignalR(routes =>  // <-- SignalR
    71             {
    72                 routes.MapHub<MyHub>("myHub");
    73             });
    74 
    75             //IHubContext<MyHub> hubContext = serviceProvider.GetService<IHubContext<MyHub>>();
    76         }
    77     }
    78 }

    以下是客户端代码

    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>ASP.NET Core SignalR</title>
        <script src="js/signalr-client.min.js"></script>
        <script src="js/jquery.min.js"></script>
    </head>
    <body>
        <div>
            <h2>Reports</h2>
            <button id="button">send</button>
            <ul id="reports"></ul>
    
            <script>
                $(function () {
    
                    let hubUrl = 'http://localhost:5000/myHub';
                    let httpConnection = new signalR.HttpConnection(hubUrl);
                    let hubConnection = new signalR.HubConnection(httpConnection);
    
                    $("#button").click(function () {
                        hubConnection.invoke('Echo', 'wiky');
                    });
    
                    hubConnection.on('OnReportPublished', data => {
                        $('#reports').append($('<li>').text(data));
                    });
    
                    hubConnection.start();
    
                });
            </script>
    
        </div>
    </body>
    </html>

    以下是执行结果:

  • 相关阅读:
    C# 枚举帮助类EnumHelper(获取描述、名称和数值)
    C# RSA非对称加密、解密及格式转换
    C# RSA加密解密及RSA签名和验证
    SQL Server 帐号权限管理及编程应用(图解)
    C# LINQ之IEqualityComparer<>接口应用
    SQL Server 表变量和临时表的区别
    SQL Server 图解备份(完全备份、差异备份、增量备份)和还原
    OpenLDAP服务器的搭建
    openstack外接ceph
    openstack
  • 原文地址:https://www.cnblogs.com/wikiz/p/8717277.html
Copyright © 2011-2022 走看看