如何使用SignalR在MVC中进行实时通知?

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

我正在尝试使用signalR进行实时通知。我的项目正在本地主机上运行。但是在设置webconfig服务器端时没有看到通知。 (尽管我用signalR做到了)

[当我运行Chrome的检查项目的“互联网”部分时,我发现请求没有落空。我该如何解决这个问题?

ajax code;

 function updateNotification() {
            $('#notiContent').empty();
            $('#notiContent').append($('<li>Yükleniyor...</li>'));
            $.ajax({
                type: 'GET',
                datatype : JSON,
                contentType: 'application/json; charset=utf-8',
                url: '/notification/GetNotificationFlows',
                success: function (response) {
                    $('#notiContent').empty();
                    if (response.length  == 0) {
                        $('#notiContent').append($('<li>Data yok..</li>'));
                    }
                    $.each(response, function (index, value) {

                        $('#notiContent').append($('<li>Yeni kişi : ' + value.flowName + ' (' + value.flowPhone + ') eklendi.</li>'));
                    });
                },
                error: function (error) {
                    console.log(error);
                }
            })
        }

Global.asax;

 string con = ConfigurationManager.ConnectionStrings["sqlConString"].ConnectionString;
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        SqlDependency.Start(con);
    }
    protected void Session_Start(object sender, EventArgs e)
    {
        NotificationComponent NC = new NotificationComponent();
        var currentTime = DateTime.Now;
        HttpContext.Current.Session["LastUpdated"] = currentTime;
        NC.RegisterNotification(currentTime);
    }
    protected void Application_End()
    {
        //here we will stop Sql Dependency
        SqlDependency.Stop(con);
    }
}

通知组件

public void RegisterNotification(DateTime currentTime)
    {
        string conStr = ConfigurationManager.ConnectionStrings["sqlConString"].ConnectionString;
        string sqlCommand = @"SELECT [flowId],[flowName],[flowEMail],[flowPhone],[kaynakId] from [dbo].[flow] where [createDate] > @createDate";
        //you can notice here I have added table name like this [dbo].[Contacts] with [dbo], its mendatory when you use Sql Dependency
        using (SqlConnection con = new SqlConnection(conStr))
        {
            SqlCommand cmd = new SqlCommand(sqlCommand, con);
            cmd.Parameters.AddWithValue("@createDate", currentTime);
            if (con.State != System.Data.ConnectionState.Open)
            {
                con.Open();
            }
            cmd.Notification = null;
            SqlDependency sqlDep = new SqlDependency(cmd);
            sqlDep.OnChange += sqlDep_OnChange;
            //we must have to execute the command here
            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                // nothing need to add here now
            }
        }
    }

    void sqlDep_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            SqlDependency sqlDep = sender as SqlDependency;
            sqlDep.OnChange -= sqlDep_OnChange;

            //from here we will send notification message to client
            var notificationHub = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
            notificationHub.Clients.All.notify("eklendi.");

            //re-register notification
            RegisterNotification(DateTime.Now);
        }
    }

    public List<flow> GetFlows(DateTime afterDate)
    {
        using (smartCMSEntities dc = new smartCMSEntities())
        {
            return dc.flow.Where(a => a.createDate > afterDate).OrderByDescending(a => a.createDate).ToList();
        }
    }

通知控制器

public JsonResult GetNotificationFlows()
    {
        var notificationRegisterTime = Session["LastUpdated"] != null ? Convert.ToDateTime(Session["LastUpdated"]) : DateTime.Now;
        NotificationComponent NC = new NotificationComponent();
        var list = NC.GetFlows(notificationRegisterTime);
        Session["LastUpdate"] = DateTime.Now;
        return new JsonResult { Data = list, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }

Notification Hub

public class NotificationHub : Hub
{
    //public void Hello()
    //{
    //    Clients.All.hello();
    //}
}

SQL(用于sql依赖项)

ALTER DATABASE [db_name] SET ENABLE_BROKER with rollback immediate;
asp.net-mvc signalr asp.net-ajax global-asax sqldependency
1个回答
0
投票

我在集线器内部创建函数时遇到了同样的问题。

   public class NotificationHub : Hub
    {
        public static void Send()
        {

            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
            context.Clients.All.displayStatus();
        }
    }

并在您的html中调用它

        function updateNotificationCount() {
            $('span.count').show();
            var count = 0;
            count = parseInt($('span.count').html()) || 0;
            count++;
            $('span.noti').css("color", "white");
        //    $('span.count').css({ "background-color": "red", "color": "white" });
            $('span.count').html(count);

        }
        // signalr js code for start hub and send receive notification
        var hub = $.connection.notificationHub;

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

            updateNotificationCount();

        };

        // Start the connection
        $.connection.hub.start();
© www.soinside.com 2019 - 2024. All rights reserved.