2016-10-20 2 views
0

j'utilise MVC 5 et j'ai ma classe de centre comme celui-ci:signalR mise à jour la page Web client avec de nouveaux articles

public class EventHub : Hub 
{ 
    public void broadcastEvent(string userId = "", 
           string source = "", 
           string application = "", 
           string type = "", 
           string importance = "", 
           string message = "", 
           string timeStamp = "", 
           string stackTrace = "", 
           string exceptionMessage = "", 
           string innerExceptionMessage = "", 
           string objectContext = "", 
           string serverName = "", 
           string actionResult = "") 
    { 
     Clients.All.broadcastEvent(userId, source, application, type, importance, message, timeStamp, stackTrace, exceptionMessage, innerExceptionMessage, objectContext, serverName); 
    } 
} 

et j'ai ce code dans ma page web:

$(function() { 
    var app = $.connection.eventHub; 
    app.client.broadcastEvent = function (userId, 
           source, 
           application, 
           type, 
           importance, 
           message, 
           timeStamp, 
           stackTrace, 
           exceptionMessage, 
           innerExceptionMessage, 
           objectContext, 
           serverName, 
           actionResult) { 
     // Html encode display name and message. 
     var encodedName = $('<div />').text(name).html(); 
     var encodedMsg = $('<div />').text(message).html(); 
     // Add the message to the page. 
     $('.row').append("div>asfdasdf</div>"); 
    }; 

    $.connection.hub.start().done(function() { 
    }); 
}); 

Et j'ai également ajouté le MapHub au démarrage de mon projet. Ma question est:

Sur le côté serveur, je veux mettre à jour la page Web dès qu'un nouvel événement a été créé. Comment puis-je déclencher la méthode de diffusion à la demande? Je ne peux pas simplement créer une instance du concentrateur et appeler la méthode.

+1

Peut-on utiliser ceci: 'var contexte = GlobalHost.ConnectionManager.GetHubContext (); context.Clients.All.broadcastEvent (....) '? En remarque, vous devriez envisager de créer une classe contenant des propriétés pour les valeurs que vous voulez envoyer au lieu de créer une fonction avec 13 paramètres. – Pawel

+0

Merci Pawel, ça marche comme un miracle! .. s'il vous plaît mettez votre commentaire comme une réponse. BTW, la raison derrière tous ces paramètres est que je ne savais pas comment sérialiser ma classe pour le client. Vous ne savez pas comment le transmettre Pouvez-vous me donner plus d'informations à ce sujet? – Pouyan

+0

Créez simplement une classe et passez une instance. Il sera transformé en JSon et vous obtiendrez un objet de l'autre côté. – Pawel

Répondre

1

Vous pouvez accéder à contexte de moyeu par GlobalHost par exemple:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
context.Clients.All.broadcastEvent(...) 
+0

Est-il possible de diffuser des données à partir de la base de données SQL Server via SignalR à chaque insertion ou modification effectuée dans les tables? J'ai besoin de montrer la mise à jour en temps réel de la base de données. Pour l'instant, j'utilise la méthode setInterval pour interroger les données de la base de données. – RGS

+1

Je suppose que vous utilisez SqlDependency pour être averti des modifications apportées à la base de données (http://stackoverflow.com/questions/15225147/watch-for-a-table-new-records-in-sql-database), puis utilisez ce qui précède invoquer une méthode de concentrateur. – Pawel

+0

Est-ce une bonne pratique d'activer le service broker dans SQL Server? Y a-t-il une dégradation des performances sur le serveur SQL? – RGS