繁体   English   中英

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

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

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

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

我想知道使用上一个链接中的代码向特定用户发送消息的最简单方法是什么。 有没有人有过或尝试过同样的经历? 我只需要想法,因为我不知道 SignalR 提供的所有功能和方法。

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

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

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

我已经在这里写博客了

所以基本上你需要

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

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 并存储到 session 存储中,因为当我们刷新浏览器时 signalR 服务器会给你新的连接 ID

接下来,当我单击按钮时,我将在服务器中调用 Send 方法,并监听“ReceiveMessage”

using connection.on(“ReceiveMessage”);

暂无
暂无

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

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