SignalR Core с Redis Pub \ Sub и консольным приложением - PullRequest
0 голосов
/ 27 июня 2018

У меня Asp.Net Core 2.1 с SignalR Core 1.0.1.

Я создал чат-приложение, которое описано здесь: https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-2.1&tabs=visual-studio

Также настроили SignalR для использования Redis с помощью

services.AddSignalR().AddRedis(Configuration["ConnectionStrings:Redis"]);

Запустив сервер Redis с помощью монитора redis-cli, я вижу следующие команды:

1530086417.413730 [0 127.0.0.1:57436] "ПОДПИСАТЬСЯ" "SignalRCore.Hubs.ChatHub: connection: VAIbFqtNyPVaod18jmm_Aw"

1530086428.181854 [0 127.0.0.1:57435] "PUBLISH" "SignalRCore.Hubs.ChatHub: all" "\ x92 \ x90 \ x81 \ xa4json \ xc4W {\" type \ ": 1, \" target \ ": \ "ReceiveMessage \", \ "аргументы \": [{\ "пользователь \": \ "пользователь \", \ "сообщение \": \ "сообщение \"}]} \ x1e "

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

var redisManager = new RedisManagerPool(configuration["ConnectionStrings:Redis"]);
using (var client = redisManager.GetClient())
{
    client.PublishMessage("SignalRCore.Hubs.ChatHub:all", "{\"type\":1,\"target\":\"ReceiveMessage\",\"arguments\":[{\"user\":\"FromConsole\",\"message\":\"Message\"}]");
}

Сообщения не обрабатываются браузером. Я предполагаю, что дело в этой дополнительной информации, которая используется для SignalR:

"\ x92 \ x90 \ x81 \ xa4json \ xc4W {...} \ x1e"

Связанные записи монитора:

1530087843.512083 [0 127.0.0.1:49480] "PUBLISH" "SignalRCore.Hubs.ChatHub: все" "{\" тип \ ": 1, \" target \ ": \" ReceiveMessage \ ", \" arguments \ " ": [{\" пользователь \ ": \" FromConsole \ "\ "сообщение \": \ "сообщение \"}]"

Есть идеи, как я могу указать эти дополнительные данные для публикации? Возможно, мне следует использовать что-то более подходящее для моего случая вместо ServiceStack.Redis

1 Ответ

0 голосов
/ 09 января 2019
using Microsoft.AspNetCore.SignalR.Protocol;

using Microsoft.AspNetCore.SignalR.Redis.Internal;

using StackExchange.Redis;

using System.Collections.Generic;

    static void Main(string[] args)
    {
        using (var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379"))
        {
            var sub = redis.GetSubscriber();

            var protocol = new JsonHubProtocol();
            var redisProtocol = new RedisProtocol(new List<JsonHubProtocol>() { protocol});
            var bytes = redisProtocol.WriteInvocation("ReceiveMessage", new[] { "60344", "60344" });

            sub.Publish("SignalRChat.Hubs.ChatHub:all", bytes);
        }
    }

Как его найти?

  1. в поиске исходного кода сигнализатора ".Publish" вы можете найти https://github.com/aspnet/SignalR/blob/c852bdcc332ffb998ec6a5b226e35d5e74d24009/src/Microsoft.AspNetCore.SignalR.StackExchangeRedis/RedisHubLifetimeManager.cs

  2. он использует RedisProtocol и пакет сообщений для .WriteBytes. кол-во колонтитулов имя кол-во ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...