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.
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;