Можно ли отправить сообщение конкретному пользователю с помощью SignalR? - PullRequest
1 голос
/ 19 октября 2019

Я новичок в SignalR, недавно изучаю и изучаю, как работает следующий код.

Ссылка: https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr

Я хотел бы знать, какой самый простой способ отправкисообщение для конкретного пользователя с использованием кода в предыдущей ссылке. Кто-нибудь имел опыт или пытался сделать то же самое? Мне просто нужны идеи, так как я не знаю всех функций и методов, которые предлагает SignalR.

В моем веб-приложении у пользователей есть уникальное имя пользователя, и мне нужно использовать эти данные для соединения. Я видел, что есть способ создавать группы и отправлять сообщения таким образом, но я не совсем понимаю, очень простой пример мне очень поможет.

Можете ли вы помочь мне или дать мне какой-нибудь совет? Спасибо

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Я уже пишу блог здесь

Так что в основном вам нужно

Сначала определите такой метод хаба, как этот

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, чтобы получить идентификатор подключения пользователя на сервере и сохранить его в хранилище сеансов, потому что когда мы обновим браузер, сервер signalR выдаст новый идентификатор подключения

Далее, когда я нажму наКнопка Я вызову метод отправки на сервере, и я буду слушать «ReceiveMessage»

using connection.on(“ReceiveMessage”);

0 голосов
/ 19 октября 2019
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

...