我无法弄清楚如何从 WebAPI ApiController 调用 SignalR 集线器。我已经整理了一个示例,您可以在此处下载,它简化了问题并演示了问题。
- 我从 ASP.NET MVC WebAPI 模板创建了一个新项目。
- 我在名为 ChatHub 的项目中添加了一个新的 SignalR Hub。
- 添加了加载时连接到 ChatHub、加入群组并向该群组发送消息的 HTML 页面。这很好用。
- HTML 页面还有一个按钮,单击该按钮将触发对 ValuesController 的 post 方法的 ajax 调用。在 ValuesController 的 post 方法中,我想向组中所有连接的客户端广播一条消息。我不能让它工作。
我有一个简单的 SignalR 集线器,只有 2 种方法。
[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);
}
}
我创建了一个非常简单的 HTML 页面,当 DOM 准备好时连接到聊天中心,如下所示。
<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>
没有什么花哨。每当连接的集线器收到新消息时,都会将新项目添加到无序列表中。有一个按钮可以对 ValuesController 的 post 方法进行 Ajax 调用。
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");
}
集线器呼叫不起作用。不会抛出错误,但永远不会收到消息。在集线器的“发送”方法中放置断点也不起作用。我觉得我做得对。有人帮忙吗?同样,源代码可以在这里找到