SignalR进度条实现教程

Web应用中,长时间运行的任务是常见的情况。用户在等待这些任务完成时,能够实时了解进度会大大提升用户体验。SignalR库正是为了解决这类问题而设计的。通过SignalR,可以轻松实现进度条功能,向用户展示任务的实时进度。本文将指导如何在MVC应用程序中快速实现SignalR进度条。

向项目添加SignalR

要开始使用SignalR,首先需要将其添加到项目中。可以通过NuGet包管理器来实现。

Tools > NuGet Package Manager > Package Manager Console

在控制台中输入以下命令并按Enter键:

Install-Package Microsoft.AspNet.SignalR

Visual Studio将为安装SignalR。安装完成后,可以在项目的Startup.cs文件中映射SignalR到应用程序。

配置SignalR

在Startup.cs文件中,需要配置SignalR。以下是一个配置示例:

using Microsoft.Owin; using Owin; [assembly: OwinStartupAttribute(typeof(SignalRProgressBarSimpleExample.Startup))] namespace SignalRProgressBarSimpleExample { public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); app.MapSignalR(); } } }

接下来,需要在_Layout.cshtml文件中包含一些脚本。

包含必要的脚本

需要按照以下顺序包含脚本:

@Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap")

jQuery和Bootstrap通常已经包含在MVC项目中,但也可以根据需要以任何方式包含它们。SignalR脚本可以从示例项目中下载。

开始连接并处理服务器发送的数据

在包含脚本之后,需要添加一些JavaScript代码来从服务器获取数据。

$(function() { var progress = $.connection.progressHub; console.log(progress); progress.client.addProgress = function(message, percentage) { ProgressBarModal("show", message + "" + percentage); $("#ProgressMessage").width(percentage); if (percentage == "100%") { ProgressBarModal(); } }; $.connection.hub.start().done(function() { var connectionId = $.connection.hub.id; console.log(connectionId); }); });

在与服务器建立连接之前,需要创建一个SignalR Hub。

创建一个新的文件夹Hubs,并在其中创建一个名为ProgressHub.cs的类,该类继承自Hub。这个类是SignalR在服务器和客户端之间通信所必需的。

using System; using Microsoft.AspNet.SignalR; namespace SignalRProgressBarSimpleExample.Hubs { public class ProgressHub : Hub { } }

在HomeController中,需要一个方法来处理客户端的请求,并在每次循环迭代时发送数据到客户端。

public JsonResult LongRunningProcess() { int itemsCount = 100; for (int i = 0; i <= itemsCount; i++) { Thread.Sleep(500); Functions.SendProgress("Process in progress...", i, itemsCount); } return Json("", JsonRequestBehavior.AllowGet); } using System; using Microsoft.AspNet.SignalR; using SignalRProgressBarSimpleExample.Hubs; namespace SignalRProgressBarSimpleExample.Util { public class Functions { public static void SendProgress(string progressMessage, int progressCount, int totalItems) { var hubContext = GlobalHost.ConnectionManager.GetHubContext(); var percentage = (progressCount * 100) / totalItems; hubContext.Clients.All.AddProgress(progressMessage, percentage + "%"); } } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485