繁体   English   中英

从 WebAPI controller 问题调用 SignalR 集线器

[英]calling SignalR hub from WebAPI controller issues

我无法弄清楚如何从 WebAPI ApiController 调用 SignalR 集线器。 我已经整理了一个示例,您可以在此处下载,它简化了问题并演示了问题。

  1. 我从 ASP.NET MVC WebAPI 模板创建了一个新项目。
  2. 我在名为 ChatHub 的项目中添加了一个新的 SignalR Hub。
  3. 添加了一个 HTML 页面,该页面在加载时连接到 ChatHub,加入群组并向该群组发送消息。 这很好用。
  4. 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>

没有什么花哨。 每当连接的集线器收到新消息时,都会将新项目添加到无序列表中。 有一个按钮可以将 Ajax 调用到 ValuesController 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");
    }

集线器呼叫不起作用。 不会抛出错误,但永远不会收到消息。 在集线器的“发送”方法中放置断点也不起作用。 我觉得我做得对。 有人帮忙吗? 同样,源代码可以在这里找到

您在客户端上调用不同的方法:

API控制器

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

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

要调用的方法是newMessage not send

chat.client.newMessage = onNewMessage;

对于 ASP.NET 内核,您现在可以执行以下操作:

[Route("some-route")]
public class MyController : ControllerBase
{
    private readonly IHubContext<MyHub> _hubContext;

    public MyController(IHubContext<MyHub> hubContext)
    {
        _hubContext = hubContext;
    }

    [HttpPost("message")]
    public async Task<ActionResult> SendMessage(string message)
    {
        await _hubContext.Clients.All.SendAsync("Message", message);
        return Ok();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM