2016-09-28 4 views
0

Je veux mettre à jour automatiquement ou informer les utilisateurs en temps réel pendant que l'administrateur génère de nouveaux messages d'alerte. Ci-dessous ma solution de code qui ne génère aucune erreur de construction et qui appelle également les méthodes de démarrage et de concentrateur lors du premier chargement de la page. Mais, je veux quand Admin ajouter un nouveau message en utilisant la page NewMessage alors il devrait mettre à jour MyHomePage automatiquement en temps réel et qui ne fonctionne pas.En utilisant SignalR 2.0 - MVC 4 - EF, je souhaite notifier les utilisateurs sur d'autres pages pendant que les messages générés par Admin

J'ai la table Myalerts et aussi j'ai activé le courtier de ma base de données par ENABLE_BROKER.

ci-dessous est mon code en solution -

Code 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(); 
    } 

Ma page d'accueil - 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> 

Code Html -

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

Mon Vue partielle qui utilise 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") 

Le NewMessage J'utilise pour ajouter de nouvelles meesages et qui est par AdminController methd. Maintenant, mon SignalR démarre correctement en première charge mais je veux quand un nouveau message est ajouté alors il doit actualiser la grille myhomepage automatiquement en utilisant la dépendance SQL.

J'ai également ajouté SqlDependency.start (connectionstring) dans global.asax

Répondre

0

problème dans votre code:

Ne pas créer des centres de votre auto.

La partie suivante est MAUVAIS:

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

Solution:

Vous devez obtenir le hubcontext avec.

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

Dans ce contexte, vous pouvez appeler les méthodes de votre concentrateur.

Informations détaillées:

Détails de asp.Site net (http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#callfromoutsidehub):

Section: "durée de vie de l'objet Hub"

Vous n'instancier pas la classe Hub ou appelez ses méthodes à partir de votre propre code sur le serveur; tout ce qui est fait pour vous par le pipeline SignalR Hubs . SignalR crée une nouvelle instance de votre classe Hub à chaque fois qu'il doit gérer une opération Hub comme lorsqu'un client se connecte, se déconnecte ou effectue un appel de méthode au serveur.

(Aller à la source de ce texte pour plus d'informations)

échantillon StockTicker de cette page:

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); 
      } 
     } 
    }