使用SignalR实时推送数据库变化

测试环境

.net 4.6

vs2017

mvc5

sqlserver2012

1.数据库

CREATE TABLE [dbo].[CarInfo](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CarNo] [varchar](50) NOT NULL,
[Lng] [varchar](50) NOT NULL,
[Lat] [varchar](50) NOT NULL,
[LocDt] [datetime] NOT NULL,
 CONSTRAINT [PK_CarInfo] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

数据库要使用service broker

ALTER DATABASE DBName SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DBName SET ENABLE_BROKER;

初始化数据库

INSERT INTO CARINFO (CARNO,LNG,LAT,LOCDT) VALUES ('豫A12345','113.123','43.123',GETDATE())

2.新建MVC项目

安装SignalR包

Install-Package Microsoft.AspNet.SignalR

修改startup.cs

    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR();
        }
    }

修改web.config,增加数据库连接字符串

    <add name="ConnString" connectionString="data source=.;initial catalog=MySignalR;persist security info=True;user id=sa;password=yourpass;" providerName="System.Data.SqlClient" />

增加数据模

    public class CarInfo
    {
        public int ID { get; set; }


        public string CarNo { get; set; }


        public string Lng { get; set; }


        public string Lat { get; set; }


        public DateTime LocDt { get; set; }
    }

新建类

    public class CarInfoHub : Microsoft.AspNet.SignalR.Hub
    {
        public static void Show()
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<CarInfoHub>();
            context.Clients.All.displayStatus();
        }
    }

业务实现

    public class CarInfoRepository
    {
        public CarInfo GetData(int id)
        {
            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand($"SELECT [ID],[CarNo],[Lng],[Lat],[LocDt] FROM [dbo].[CarInfo] WHERE ID = {id}", connection))
                {
                    command.Notification = null;


                    SqlDependency dependency = new SqlDependency(command);
                    dependency.OnChange += dependency_OnChange;


                    if (connection.State == ConnectionState.Closed)
                        connection.Open();


                    using (var reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            return new CarInfo()
                            {
                                ID = reader.GetInt32(0),
                                CarNo = reader.GetString(1),
                                Lng = reader.GetString(2),
                                Lat = reader.GetString(3),
                                LocDt = reader.GetDateTime(4)
                            };
                        }
                    }
                }
            }


            return null;
        }


        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            CarInfoHub.Show();
        }
    }

修改Global.asax

        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
            SqlDependency.Start(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);


            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }


        protected void Application_End(object sender, EventArgs e)
        {
            SqlDependency.Stop(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
        }

新建API

    public class DefaultController : ApiController
    {
        readonly CarInfoRepository _repository = new CarInfoRepository();


        // GET api/values
        public CarInfo Get(int id)
        {
            return _repository.GetData(id);
        }
    }

修改控制器

        public ActionResult Index()
        {

//这里只是测试功能,指定了车辆编号
            ViewBag.ID = 1;
            return View();
        }

修改视图

@{
    Layout = null;
}


<!DOCTYPE html>


<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>车辆实时跟踪</title>
    <script src="~/Scripts/jquery-1.10.2.min.js"></script>
    <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
    <script src="~/signalr/hubs" type="text/javascript"></script>
    <script type="text/javascript">
        var maxID;
        $(function () {
            var CarID = @ViewBag.ID;
            // Proxy created on the fly
            var job = $.connection.carInfoHub;


            // Declare a function on the job hub so the server can invoke it
            job.client.displayStatus = function () {
                getData();
            };


            // Start the connection
            $.connection.hub.start();
            getData();
        });


        function getData() {
            var $tbl = $('#tblJobInfo');
            $.ajax({
                url: '../api/Default/'+CarID,
                type: 'GET',
                datatype: 'json',
                success: function (data) {
                    $tbl.empty();
                    $tbl.append(' <tr><th>ID</th><th>CarNo</th><th>Lng</th><th>Lat</th></tr>');
                    var str ='<tr><td>' + data.ID + '</td><td>' + data.CarNo + '</td><td>' + data.Lng + '</td><td>' + data.Lat + '</td></tr>';
                    $tbl.append(str);
                }
            });
        }
    </script>
</head>
<body>
    <div>
        <table id="tblJobInfo" style="text-align: center; margin-left: 10px">
        </table>
    </div>
</body>
</html>

现在测试一下

update carinfo set 
Lng = CAST(Lng as float)+0.0001,
Lat = CAST(Lat as float)+0.0001,
LocDt = getdate();

面页数据可以实时发生变化。使用SignalR实时推送数据库变化-C#文档类资源-CSDN文库

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 ASP.NET MVC 中使用 SignalR 实现推送功能需要以下步骤: 1. 在 Visual Studio 中创建一个 ASP.NET MVC 项目。 2. 通过 NuGet 安装 SignalR 库。 3. 创建一个 SignalR Hub 类。Hub 类是用来处理客户端和服务器之间的连接和消息传递的核心组件。 4. 在 Startup.cs 中配置 SignalR 中间件。 5. 在客户端 JavaScript 中引用 SignalR 库,并连接到 SignalR Hub。 6. 在 SignalR Hub 中定义需要推送的消息方法,然后在服务器端调用该方法以向客户端发送消息。 下面是一个简单的示例: 1. 创建一个名为 ChatHub 的 SignalR Hub 类: ```csharp using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace MvcSignalR.Hubs { public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } } } ``` 2. 在 Startup.cs 中配置 SignalR 中间件: ```csharp using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using MvcSignalR.Hubs; namespace MvcSignalR { public class Startup { public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSignalR(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseStaticFiles(); app.UseSignalR(routes => { routes.MapHub<ChatHub>("/chathub"); }); app.UseMvcWithDefaultRoute(); } } } ``` 3. 在客户端 JavaScript 中引用 SignalR 库,并连接到 SignalR Hub: ```javascript <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script src="/lib/signalr/dist/browser/signalr.js"></script> <script> var connection = new signalR.HubConnectionBuilder().withUrl("/chathub").build(); connection.start().then(function () { console.log("connected"); }).catch(function (err) { return console.error(err.toString()); }); connection.on("ReceiveMessage", function (user, message) { console.log(user + " says " + message); }); $("#sendButton").click(function () { var user = $("#userInput").val(); var message = $("#messageInput").val(); connection.invoke("SendMessage", user, message).catch(function (err) { return console.error(err.toString()); }); }); </script> ``` 4. 在 SignalR Hub 中定义需要推送的消息方法,然后在服务器端调用该方法以向客户端发送消息。 在这个示例中,当客户端调用 SendMessage 方法时,服务器将向所有连接的客户端发送 ReceiveMessage 消息。 以上就是在 ASP.NET MVC 中使用 SignalR 实现推送功能的基本步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值