signalr使用同一浏览器在同一页面上创建新的连接ID,默认情况下在c#中刷新

问题描述 投票:1回答:1

默认情况下,signaler集线器在每次页面加载时启动,并在同一浏览器上的同一页面刷新或c#中的新选项卡上创建新的连接ID。

很抱歉,它不是信号器问题,但是在我的情况下,但是我需要如何更新信号器。

signalr在每个页面刷新时创建新的连接ID,并保留先前的连接ID。当收到任何更新时,它将向每个新的连接发送更新

但是我希望每个选项卡为一个浏览器提供1个连接,它不应在刷新或新选项卡上为同一浏览器创建新的连接ID。

我使用的代码:

  1. JobHub.cs

    public class JobHub : Hub
     {
        public static void Show()
           {
            IHubContext context =   GlobalHost.ConnectionManager.GetHubContext<JobHub>();
            context.Clients.All.displayStatus();
           }
      }
    
  2. View.cshtml

     <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 job = $.connection.jobHub;
     job.client.displayStatus = function () {
                alert("change notice");
                getData();
            };
    
     $.connection.hub.start().done(function () {
                //connection started
                alert("connection started");
                getData();
            });
    
     function getData() {
            var $tbl = $('#tblJobInfo');
            $.ajax({
                url: 'http://localhost:51737/api/values',
                type: 'GET',
                datatype: 'json',
                success: function (data) {
                    if (data.length > 0) {
                        $tbl.empty();
                        $tbl.append(' <tr><th>ID</th><th>Name</th><th>Last Executed Date</th><th>Status</th></tr>');
                        var rows = [];
                        for (var i = 0; i < data.length; i++) {
                            rows.push(' <tr><td>' + data[i].JobID + '</td><td>' + data[i].Name + '</td><td>' + data[i].LastExecutionDate.toString().substr(0,10) + '</td><td>' + data[i].Status + '</td></tr>');
                        }
                        $tbl.append(rows.join(''));
                    }
                }
            });
        }
    

  3. Div

     <div>
     <table id="tblJobInfo" style="text-align:center;margin-left:10px"> </table></div>
    
  4. [JobInfo.csJobInfoRepository.cs

    public class JobInfo
    {
        public int JobID { get; set; }
        public string Name { get; set; }
        public DateTime LastExecutionDate { get; set; }
        public string Status { get; set; }
    }
    public class JobInfoRepository
    {
    
        public IEnumerable<JobInfo> GetData()
        {
    
            using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand(@"SELECT [JobID],[Name],[LastExecutionDate],[Status]
               FROM [dbo].[JobInfo]", connection))
                {
                    // Make sure the command object does not already have
                    // a notification object associated with it.
                    command.Notification = null;
    
                    SqlDependency dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
    
                    if (connection.State == System.Data.ConnectionState.Closed)
                        connection.Open();
    
                    using (var reader = command.ExecuteReader())
                        return reader.Cast<IDataRecord>()
                            .Select(x => new JobInfo()
                            {
                                JobID = x.GetInt32(0),
                                Name = x.GetString(1),
                                LastExecutionDate = x.GetDateTime(2),
                                Status = x.GetString(3)
                            }).ToList();
    
    
    
                }
            }
        }
        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
    
            //calling hub notification
            JobHub.Show();
    
        }
    }
    
  5. API ValuesController.cs

    public class ValuesController : ApiController
    {
     JobInfoRepository objRepo = new JobInfoRepository();
    
     // GET api/values
     public IEnumerable<JobInfo> Get()
     {
        return objRepo.GetData();
     }
    }
    

    在刷新页面后,只要我得到DB的更新,它就会多次调用sql依赖项更改事件。请指导或帮助我,我该如何处理这种情况。感谢您的宝贵时间和精力。

c# signalr signalr.client sqldependency
1个回答
0
投票

您是否得到上述答案?

© www.soinside.com 2019 - 2024. All rights reserved.