【问题标题】:Using SignalR 2.0 - MVC 4 - EF, I want to notify users on other pages while messages generated by Admin使用 SignalR 2.0 - MVC 4 - EF,我想在管理员生成消息时通知其他页面上的用户
【发布时间】:2016-09-29 14:12:37
【问题描述】:

我想在管理员生成新警报消息时自动更新或实时通知用户。

以下是我的代码解决方案,它没有给出任何构建错误,并且在第一次加载页面时还调用启动和集线器方法。但是,我希望当管理员使用 NewMessage 页面添加新消息时,它应该实时自动更新 MyHomePage 而这不起作用。

我有 Myalerts 表,并且我通过 ENABLE_BROKER 启用了我的数据库代理。

以下是我在解决方案中的代码 -

HomeControler 代码 -

 public ActionResult MyAlerts()
    {
        var AlertsNMessages = AlertsMessagesList();
        var ajaxGridFactory = new AjaxGridFactory();
        var grid = ajaxGridFactory.CreateAjaxGrid(AlertsNMessages, 1, false);

        return PartialView("MyAlerts", grid);
    }

    void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
        {
            AlertsMessagesHub messageHub = new AlertsMessagesHub();
            messageHub.Send();
        }
    }



public IQueryable<SiteAlert> AlertsMessagesList()
        {
            var model = GetCustomerAccessListData();
            var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString);
            SqlDependency dependency = new SqlDependency();

            dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

            if (connection.State == ConnectionState.Closed) connection.Open();
           SqlDependency.Start(connection.ConnectionString);
           return db.MyAlerts.OrderByDescending(o => o.AlertId).AsQueryable();
   }

我的主页 - JavaScript --

   $(function () {
            debugger;
            // Declare a proxy to reference the hub.
            var notifications = $.connection.alertsMessagesHub;

            //debugger;
            // Create a function that the hub can call to broadcast messages.
            notifications.client.updateMessages = function () {
                getAllMessages()
            };

            // Start the connection.
            $.connection.hub.start().done(function () {
                notifications.server.send();
            }).fail(function (e) {
                alert(e);
            });
        });


        function getAllMessages() {
            debugger;
            var tbl = $('#DivMyMessages');
            $.ajax({
                url: '/home/MyAlerts',
                contentType: 'application/html ; charset:utf-8',
                type: 'GET',
                dataType: 'html'
            }).success(function (result) {
                tbl.empty().append(result);
            }).error(function () {

            });
        }
    </script>

HTML代码-

  <div id="DivMyMessages">
                @{Html.RenderAction("MyMessages");}
     </div>

我使用 Grid.MVC.AJAX 的部分视图

sing GridMvc.Html
@model Grid.Mvc.Ajax.GridExtensions.AjaxGrid<DashboardSite.Models.MyAlerts>

@Html.Grid(Model.GridItems).Named("MyAlerts").Columns(columns =>
           {
               columns.Add(o => o.AlertType)
                .SetWidth(3)
                .Encoded(false)
                .Sanitized(false)
                .Titled("")
               columns.Add(a => a.StartTime).SetWidth(150)
                .SetWidth(10)
                .Encoded(false)
                .Sanitized(false)
                .Titled("Start Date")
                .Sortable(false)
              columns.Add(a => a.Title).SetWidth(150)
               .SetWidth(175)
                .Encoded(false)
                .Sanitized(false)
                .Titled("Title")
                .Sortable(false)
           }).WithPaging(5, 10, "MyAlerts")

我用来添加新消息的 NewMessage 是通过 AdminController 方法。

现在,我的 SignalR 在第一次加载时正常启动,但我希望在添加新消息时它应该使用 sql 依赖项自动刷新 myhomepage 网格。

我还在 global.asax 中添加了 SqlDependency.start(connectionstring)

【问题讨论】:

    标签: .net asp.net-mvc signalr signalr-hub


    【解决方案1】:

    代码中的问题:

    不要自己创建集线器。

    以下部分是错误的:

    AlertsMessagesHub messageHub = new AlertsMessagesHub();
    messageHub.Send();
    

    解决方案:

    您需要获取 hubcontext。

    GlobalHost.ConnectionManager.GetHubContext<[HubName]>(). …
    

    在这种情况下,您可以调用集线器的方法。

    详细信息:

    来自 asp.net 网站 (http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#callfromoutsidehub) 的详细信息:

    部分:“中心对象生命周期”

    您不会实例化 Hub 类或从您自己的方法调用其方法 服务器上的代码; SignalR 集线器为您完成的所有工作 管道。 SignalR 每次都会创建一个新的 Hub 类实例 它需要处理集线器操作,例如客户端连接时, 断开连接,或对服务器进行方法调用。

    (更多信息请转到本文的来源)

    此页面的股票代码示例:

    public class StockTicker
    {
        // Singleton instance
        private readonly static Lazy<StockTicker> _instance = new Lazy<StockTicker>(
            () => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>()));
    
        private IHubContext _context;
    
        private StockTicker(IHubContext context)
        {
            _context = context;
        }
    
        // This method is invoked by a Timer object.
        private void UpdateStockPrices(object state)
        {
            foreach (var stock in _stocks.Values)
            {
                if (TryUpdateStockPrice(stock))
                {
                    _context.Clients.All.updateStockPrice(stock);
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      相关资源
      最近更新 更多