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

时间:2019-10-18 23:10:42

标签: javascript c# asp.net asp.net-core signalr

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

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

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

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

您能帮我还是给我一些建议?谢谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我已经写了一个博客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”);