c# - 从 WebAPI Controller 问题调用 SignalR hub

标签 c# signalr

我不知道如何从 WebAPI ApiController 调用 SignalR 集线器。我整理了一个示例,您可以下载 here,它简化了问题并演示了问题。

  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>

没什么好看的。每当连接的集线器收到一条新消息时,一个新项目就会添加到无序列表中。有一个按钮可以对 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");
    }

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

最佳答案

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

API Controller

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

枢纽

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

你要调用的方法是newMessage不是send

chat.client.newMessage = onNewMessage;

关于c# - 从 WebAPI Controller 问题调用 SignalR hub,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16695975/

相关文章:

c# - 如何在 .net 中嵌入 word 文档

c# - 设计时的火灾事件?

c# - 连接到数据库时,使用数据库连接进行单元测试会抛出错误

ajax - Ajax 调用后脚本在局部 View 上不起作用

c# - 在运行空间中导入或加载模块,仍然 'Connect-AzureRMAccount' 抛出 'command not recognised as cmdlet..'

c# - 通过枚举属性而不是使用 GetType() 来识别对象类型是一种不好的做法吗?

javascript - 我们如何确定发起SignalR扩展方法的组?

c# - 如何使用 AspNetCore SignalR 创建集线器代理

c# - 保证消息传递

c# - Signalr - 重写发送消息的方法