【问题标题】:It is possible to send a message to a specific user using SignalR?可以使用 SignalR 向特定用户发送消息吗?
【发布时间】:2020-02-15 22:34:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我已经写博客了here

    所以基本上你需要

    首先像这样定义一个 hub 方法

    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 方法并进行监听 关于“接收消息”

    using connection.on(“ReceiveMessage”);

    【讨论】:

    • 非常感谢您的回复,非常详细。我很忙,但今天我会尝试按照你的指示让我的代码正常工作。
    【解决方案2】:
    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

    【讨论】:

    • 你应该解释它的作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2015-04-27
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多