核心 2.1 SignalR 和 SQLDependency

Posted

技术标签:

【中文标题】核心 2.1 SignalR 和 SQLDependency【英文标题】:Core 2.1 SignalR and SQLDependency 【发布时间】:2018-08-01 15:36:04 【问题描述】:

是否有任何 Core 2.1 示例可用于将 SignalR 与 SQLDependency 结合使用。 是否启用了代理等,但从未获得任何对 onChange 事件触发的依赖。只是事件订阅被触发。 当后端的 MS-SQL 数据库表 Cities 发生更改时,我希望看到更改立即反映在客户端网页上,而无需刷新/重新加载页面。

//在ConfigureServices中启动app时启动依赖 SqlDependency.Start(Configuration.GetConnectionString("DefaultConnection"));

using Microsoft.AspNetCore.SignalR;
using SignalR_Test4.Data;
using SignalR_Test4.Hubs;
using System.Collections.Generic;
using System.Data.SqlClient;

namespace SignalR_Test4.Models

    public class CityRepository
    
    private readonly ApplicationDbContext _context;
    private readonly IHubContext<CityHub> _hubcontext;
    public CityRepository(ApplicationDbContext context, IHubContext<CityHub> hubcontext)
    
        _context = context;
        _hubcontext = hubcontext;
    

    public IEnumerable<City> GetCities()
    
        List<City> listOf = new List<City>();
        //listOf = _context.Cities;

        using (var conn = new SqlConnection(GlobalVar.connectionString))
        
            conn.Open();
            using (var cmd = new SqlCommand(@"SELECT * FROM Cities", conn))
            
                cmd.Notification = null;
                SqlDependency dependency = new SqlDependency(cmd);
                dependency.OnChange += Dependency_OnChange;

                if (conn.State == System.Data.ConnectionState.Closed)
                    conn.Open();


                var reader = cmd.ExecuteReader();
                while (reader.Read())
                
                    listOf.Add(new City  Id = (string)reader["Id"], Name_en = (string)reader["name_en"], CountryId = (string)reader["CountryId"], Code = (string)reader["Code"] );
                
            
        
        return listOf;
    
    private void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
    
        if (e.Type == SqlNotificationType.Change)
        
            _hubcontext.Clients.All.SendAsync("GetCities");
        
    



【问题讨论】:

注意:Service Broker 在大多数 SQL Azure 级别上不可用 - 因此,除非您有托管实例,否则请务必先尝试,甚至可以在编写任何代码之前启用它! 【参考方案1】:

问题出在行内:

var cmd = new SqlCommand(@"SELECT Id, Name_en, CountryId, Code from [dbo].Cities", conn)

需要使用字段名称(不是 *)以及 2 部分表名称约定 => [dbo].Cities

【讨论】:

我正在使用相同的技术,但是我得到一个错误:当使用 SqlDependency 而不提供选项值时,必须在执行添加到 SqlDependency 实例的命令之前调用 SqlDependency.Start() .

以上是关于核心 2.1 SignalR 和 SQLDependency的主要内容,如果未能解决你的问题,请参考以下文章

SignalR 核心和跨域请求的问题

SignalR 2.1 简单入门项目

Signalr 带有角度和 .net 核心错误,代码为 1006

如何为 ASPNETCore 2.1 应用程序配置 SignalR Cors?

SignalR 正在重新连接 .net 3.1 核心中的每个视图秒

.net core 3.0 Signalr - 05 使用jwt将用户跟signalr关联