l'appel de SignalR hub de WebAPI contrôleur de questions
Je ne peux pas comprendre comment je peut appeler un SignalR hub à partir d'un WebAPI ApiController. J'ai rassemblé un échantillon que vous pouvez télécharger ici qui simplifie le problème et illustre le problème.
- J'ai créé un nouveau projet à partir de la ASP.NET MVC WebAPI modèle.
- J'ai ajouté un nouveau SignalR Hub pour le projet appelé ChatHub.
- Ajouté une page HTML qui en charge, se connecte à ChatHub, se joint à un groupe et envoie un message à ce groupe. Cela fonctionne très bien.
- Page HTML dispose également d'un bouton qui lorsqu'il est cliqué va déclencher un appel ajax à la ValuesController de la méthode post. Dans le ValuesController la méthode post, je veux diffuser un message à tous les clients connectés du groupe. Je ne peux pas obtenir que cela fonctionne.
J'ai un simple SignalR hub avec seulement 2 méthodes.
[HubName("chat")]
public class ChatHub : Hub
{
public void Join(string room)
{
//NOTE: this is not persisted - ....
Groups.Add(Context.ConnectionId, room);
}
public void Send(string room, string message)
{
var msg = String.Format(
"{0}: {1}", Context.ConnectionId, message);
Clients.Group(room).newMessage(msg);
}
}
J'ai créé un très simple page HTML qui se connecte au Chat hub lorsque le DOM est prêt, comme illustré ici.
<html>
<head>
<title>Simple Chat</title>
<script src="Scripts/jquery-1.8.2.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-1.0.0.js"></script>
<script src="signalr/hubs"></script>
<script type="text/javascript">
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('<li>' + message + '</li>');
};
</script>
</head>
<body>
<div>
<h2>Chat</h2>
<input type="button" id="controller" value="Controller Method" />
<div>
<h2>Message(s) Received</h2>
<ul id="messages"></ul>
</div>
</div>
</body>
</html>
Rien de fantaisie. Chaque fois que le concentrateur reçoit un nouveau message, un nouvel élément est ajouté à la liste non ordonnée. Il y a un bouton qui fait un appel Ajax dans le ValuesController méthode post.
public class ValuesController : ApiController
{
//POST api/values
public void Post([FromBody]string value)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
hubContext.Clients.Group("TestGroup").send("TestGroup", "Called from Controller");
}
L'appel Hub ne fonctionne pas. Une erreur n'est pas levé, mais, le message n'est jamais reçu. Mettant un point d'arrêt dans la méthode "Send" de la plate-forme ne fonctionne pas non plus. J'ai l'impression que je suis en train de faire. Aider quelqu'un? De nouveau, le code source peut être trouvé ici
OriginalL'auteur DapperDanh | 2013-05-22
Vous devez vous connecter pour publier un commentaire.
Vous appelez différentes méthodes sur le client:
API contrôleur
Hub
La méthode que vous voulez l'appeler, est newMessage pas envoyer
C'est le point 🙂
Est-il possible d'appeler le réel ChatHub.Méthode d'envoi de la ApiController? Au-dessus de la façon de faire semble contourner ChatHub et allez tout droit vers le Hub Contexte pour faire l'équivalence de ce que ChatHub.Envoyez - mais tout ce que j'ai dans ChatHub.Envoyer ne fonctionne pas\devra être répliquées dans le ApiController? Peut-être que je suis juste en manque de quelque chose ici.
Nope. Vous ne pouvez pas appeler la méthode des centres à partir du serveur. Vous auriez besoin de déplacer la logique à une salle de classe qui peut être appelé à partir à la fois à l'intérieur et à l'extérieur du moyeu.
OriginalL'auteur davidfowl