appel du concentrateur SignalR à partir de problèmes liés au contrôleur WebAPI

Je n’arrive pas à comprendre comment appeler un hub SignalR à partir d’un WebAPI ApiController. J’ai mis en place un exemple que vous pouvez télécharger ici qui simplifie le problème et le démontre.

  1. J’ai créé un nouveau projet à partir du modèle ASP.NET MVC WebAPI.
  2. J’ai ajouté un nouveau SignalR Hub au projet appelé ChatHub.
  3. Ajout d’une page HTML qui, en charge, se connecte à ChatHub, se joint à un groupe et envoie un message à ce groupe. Cela fonctionne très bien.
  4. La page HTML contient également un bouton qui déclenche un appel ajax à la méthode de publication de ValuesController lorsque vous cliquez dessus. Dans la méthode de publication de ValuesController, je souhaite diffuser un message à tous les clients connectés du groupe. Je n’arrive pas à faire fonctionner ça.

J’ai un hub SignalR simple avec seulement 2 méthodes.

[HubName("chat")] public class ChatHub : Hub { public void Join(ssortingng room) { // NOTE: this is not persisted - .... Groups.Add(Context.ConnectionId, room); } public void Send(ssortingng room, ssortingng message) { var msg = Ssortingng.Format( "{0}: {1}", Context.ConnectionId, message); Clients.Group(room).newMessage(msg); } } 

J’ai créé une page HTML très simple qui se connecte au hub de conversation lorsque le DOM est prêt, comme illustré ici.

   Simple Chat     var chat; //$(function () { // connectToHubs(); //}); $(connectToHubs); function connectToHubs() { $.connection.hub.logging = true; chat = $.connection.chat; chat.client.newMessage = onNewMessage; $.connection.hub.start({ transport: 'longPolling' }).done(function () { chat.server.join("TestGroup").done(function () { chat.server.send("TestGroup", "message from html"); }); }); $('#controller').click(postProficiencyUserAction); } var postProficiencyUserAction = function () { //var token = $('[name=__RequestVerificationToken]').val(); var headers = {}; //headers["__RequestVerificationToken"] = token; //var userAction = { createdOn: "2013-05-21T00:00:00", userId: "12345678-1234-1234-1234-000000000001", actionId: "12345678-1234-1234-1234-000000000003" }; $.ajax({ type: 'POST', url: 'http://localhost:58755/api/values', cache: false, headers: headers, contentType: 'application/json; charset=utf-8', data: 'test', dataType: "json", success: function () { }, error: function () { } }); }; function onNewMessage(message) { // ... todo: validation !!!! :) $('#messages').append('
  • ' + message + '
  • '); };

    Chat

    Message(s) Received

      Rien d’extraordinaire. Chaque fois que le concentrateur connecté reçoit un nouveau message, un nouvel élément est ajouté à la liste non sortingée. Un bouton permet d’appeler Ajax dans la méthode post de ValuesController.

       public class ValuesController : ApiController { // POST api/values public void Post([FromBody]ssortingng value) { var hubContext = GlobalHost.ConnectionManager.GetHubContext(); hubContext.Clients.Group("TestGroup").send("TestGroup", "Called from Controller"); } 

      L’appel du hub ne fonctionne pas. Une erreur n’est pas générée, mais le message n’est jamais reçu. Mettre un point d’arrêt dans la méthode “Envoyer” du Hub ne fonctionne pas non plus. J’ai l’impression de bien faire les choses. Quelqu’un aide? Encore une fois, le code source peut être trouvé ici

      Vous appelez différentes méthodes sur le client:

      Contrôleur API

       hubContext.Clients.Group("TestGroup").send("TestGroup", "Called from Controller"); 

      Centre

       Clients.Group(room).newMessage(msg); 

      La méthode que vous souhaitez appeler est newMessage not send

       chat.client.newMessage = onNewMessage;