代码之家  ›  专栏  ›  技术社区  ›  Morten_564834

从控制器ASP.NET Core 2.1调用特定客户端的信号器

  •  1
  • Morten_564834  · 技术社区  · 6 年前

    用户在浏览器中提交表单后,我需要从服务器向客户端发送即时消息。

    我遵循微软的步骤 here 要设置信号器连接,请创建集线器类signalR.js等。

    问题是,我只能向所有客户机调用一条消息,但我需要向发起请求的特定调用方调用该消息(否则每个人都将获得该消息)。

    这是我在HomeController.cs中的后期操作:

    [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Submit(string signalRconnectionId, Dictionary<string, string> inputs)
        {
            //Invoke signal to all clients sending a message to initSignal WORKS FINE
            await _signalHubContext.Clients.All.SendAsync("initSignal", "This is a message from the server!");
    
            //Invoke signal to specified client where signalRConnectionId = connection.id DOES NOT WORK
            await _signalHubContext.Clients.Client(signalRconnectionId).SendAsync("initSignal", "This is a message from server to this client: " + signalRconnectionId);
    
            return RedirectToAction("Success", inputs);
        }
    

        //Create connection and start it
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/signalHub")
        .configureLogging(signalR.LogLevel.Information)
        .build();
    connection.start().catch(err => console.error(err.toString()));
    
    console.log("connectionID: " + connection.id);
    $("#signalRconnectionId").attr("value", connection.id);
    
    //Signal method invoked from server
    connection.on("initSignal", (message) => {
    
        console.log("We got signal! and the message is: " + message);
    
    
    });
    

    我已经试过调试action方法,并且在connectionId中得到了正确的传递,它是“0”(每个连接递增1)

    2 回复  |  直到 6 年前
        1
  •  5
  •   Morten_564834    6 年前

    所以这是最终的解决方案,我从 this thread

    我通过从client调用Hub类,然后从client调用传入connectionId的控制器来获得connectionId。

    public class SignalHub : Hub
    {
    
    
        public string GetConnectionId()
        {
            return Context.ConnectionId;
        }
    }
    

    启动时执行的客户端javascript代码:

    connection.start().catch(err => console.error(err.toString())).then(function(){
    connection.invoke('getConnectionId')
        .then(function (connectionId) {
            // Send the connectionId to controller
            console.log("connectionID: " + connectionId);
            $("#signalRconnectionId").attr("value", connectionId);
        });
    

    });

    public async Task<IActionResult> Submit(string signalRconnectionId, Dictionary<string, string> inputs)
        {
    
            //Invoke signal to specified client WORKS NOW
            await _signalHubContext.Clients.Client(signalRconnectionId).SendAsync("initSignal", "This is a message from server to this client: " + signalRconnectionId);
    
            return RedirectToAction("Success", inputs);
        }
    

    它工作得很好,但感觉还是有点像往返旅行,如果我们不必通过hub类来实现这一点的话会更容易。也许只是从客户端开始使用connectionId,但也许有一个很好的设计理由:)

        2
  •  0
  •   user8013875    6 年前

    https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-2.1

    当从 Hub 班级,没有 这个 ConnectionId , Caller Others 财产。