可以使用 SignalR 向特定用户发送消息吗?

It is possible to send a message to a specific user using SignalR?

我是 SignalR 的新手,最近我正在检查和学习以下代码的工作原理。

Link: https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr

我想知道使用前面 link 中的代码向特定用户发送消息的最简单方法是什么。有没有人有经验或试图做同样的事情?我只是需要一些想法,因为我不知道 SignalR 提供的所有功能和方法。

在我的网络应用程序中,用户有一个唯一的用户名,我需要使用该数据进行连接。我看到有一种方法可以创建组并以这种方式发送消息,但我不完全理解,一个非常简单的例子对我有很大帮助。

你能帮助我或给我一些建议吗?谢谢

public class MyHub : Hub
{
    public void Send(string userId, string message)
    {
        Clients.User(userId).send(message);
    }
}

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections

我已经在写博客了here

所以基本上你需要

首先像这样定义一个集线器方法

public async Task Send(string userId)
        {
            var message = $"Send message to you with user id {userId}";
            await Clients.Client(userId).SendAsync("ReceiveMessage", message);
        }

添加到startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure(options =>
            {
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();
            app.UseCookiePolicy();
            app.UseSignalR(routes =>
            {
                routes.MapHub<ConnectionHub>("/connectionHub");
            });
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

然后终于

(function () {
        var connection = new signalR.HubConnectionBuilder().withUrl("/connectionHub").build();

        connection.start().then(function () {
            console.log("connected");

            connection.invoke('getConnectionId')
                .then(function (connectionId) {
                    sessionStorage.setItem('conectionId', connectionId);
                    // Send the connectionId to controller
                }).catch(err => console.error(err.toString()));;


        });

        $("#sendmessage").click(function () {
            var connectionId = sessionStorage.getItem('conectionId');
            connection.invoke("Send", connectionId);
        });

        connection.on("ReceiveMessage", function (message) {
            console.log(message);
        });

    })();

首先,我需要使用

与服务器建立连接

new signalR.HubConnectionBuilder().withUrl(“/connectionHub”).build()

然后当连接开始时,我将调用 getConnectionId 来获取服务器中的用户连接 ID 并存储到会话存储中,因为当我们刷新浏览器时,signalR 服务器将为您提供新的连接 ID

下一步,当我点击按钮时,我将调用服务器中的 Send 方法,我将监听 关于“ReceiveMessage”

using connection.on(“ReceiveMessage”);