Уведомления об обновлении базы данных SignalR в ASP.NET MVC с использованием зависимости от SQL - PullRequest
0 голосов
/ 24 января 2019

Я установил пример приложения ASP.NET MVC signalR с помощью брокера служб SQL Server. Я использовал учебник в https://www.codeproject.com/articles/874240/signalr-database-update-notifications-in-asp-net-m

Я также установил для своей базы данных ALTER DATABASE BlogDemos SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE;

Я использую SQL 2012, иногда он вызывается клиентской функцией с ENABLE_BROKER, но вызывается не каждый раз.

У меня есть пара вопросов:

1) Когда я обновляю и изменяю запись в базе данных, на клиентском сайте ничего не происходит, если я снова не выполню следующий запрос: ALTER DATABASE Your_DB_Name SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE; хотя иногда на клиентском сайте не происходит никаких изменений даже после выполнения этого запроса. 2) После выполнения вышеуказанного запроса (... ENABLE_BROKER ...) требуется 10 секунд , чтобы увидеть изменения на стороне клиента

3) Функция GetMessages вызывается пару раз с задержкой около 10 секунд.

Hub : 
MessageHubs.cs:

namespace SignalRDbUpdates.Hubs
{
    public class MessagesHub : Hub
    {
        private static string conString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();

        [HubMethodName("sendMessages")]
        public static void SendMessages()
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessagesHub>();
            context.Clients.All.updateMessages();
        }        
    }
}

MessagesRepository.cs

namespace SignalRDbUpdates.Models
{
    public class MessagesRepository
    {
        readonly string _connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

        public IEnumerable<Messages> GetAllMessages()
        {
            var messages = new List<Messages>();
            using (var connection = new SqlConnection(_connString))
            {
                connection.Open();
                using (var command = new SqlCommand(@"SELECT [MessageID], [Message], [EmptyMessage], [Date] FROM [dbo].[Messages]", connection))
                {
                    command.Notification = null;

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

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

                    var reader = command.ExecuteReader();

                    while (reader.Read())
                    {
                        messages.Add(item: new Messages { MessageID = (int)reader["MessageID"], Message = (string)reader["Message"], EmptyMessage =  reader["EmptyMessage"] != DBNull.Value ? (string) reader["EmptyMessage"] : "", MessageDate = Convert.ToDateTime(reader["Date"]) });
                    }
                }

            }
            return messages;


        }

        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            if (e.Type == SqlNotificationType.Change)
            {
                MessagesHub.SendMessages();
            }


        }
    }
}

index.chtml

@{
    ViewBag.Title = "Home Page";
}

<div class="row">
    <div class="col-md-12">
        <div id="messagesTable"></div>
    </div>
</div>
@section Scripts{

    <script src="~/Scripts/jquery.signalR-2.4.0.js"></script>     
    <script src="/signalr/hubs"></script>
    <script type="text/javascript">
        $(function () {            
            var Notifications = $.connection.messagesHub;
            Notifications.client.updateMessages = function () {
                getAllMessages()
                //alert('Updated!')                
            };

            // 
            $.connection.hub.start().done(function () {                
                getAllMessages();
                console.log('connected--started')
            }).fail(function (e) {
                alert(e);
            });
        });


        function getAllMessages() {
            var tbl = $('#messagesTable');
            $.ajax({
                url: '/home/GetMessages',
                contentType: 'application/html ; charset:utf-8',
                type: 'GET',
                async: true,
                dataType: 'html'
            }).success(function (result) {
                tbl.empty().append(result);
                console.log('result......');
                return true
            }).error(function () {
                alert('ERROR!')
            });
        }


    </script>
}

startup.cs

using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Owin;
using System.Configuration;

[assembly: OwinStartupAttribute(typeof(SignalRDbUpdates.Startup))]
namespace SignalRDbUpdates
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            string connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
            app.MapSignalR();   
        }
    }
}

Global.asax

    namespace SignalRDbUpdates
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            string connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                GlobalConfiguration.Configure(WebApiConfig.Register);           
                //SqlDependency.Start(connString);
                SqlDependency.Start(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
        }

        protected void Application_End()
            {

                //SqlDependency.Stop(connString);
                SqlDependency.Stop(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...