簡體   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