带有Redis Pub \ Sub和控制台应用程序的SignalR Core

时间:2018-06-27 08:27:08

标签: servicestack.redis asp.net-core-signalr

我有带SignalR Core 1.0.1的Asp.Net Core 2.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-cli Monitor启动了Redis服务器,我可以看到以下命令:

  

1530086417.413730 [0 127.0.0.1:57436]“ SUBSCRIBE”“ SignalRCore.Hubs.ChatHub:connection:VAIbFqtNyPVaod18jmm_Aw”

     

1530086428.181854 [0 127.0.0.1:57435]“发布”“ SignalRCore.Hubs.ChatHub:all”“ \ x92 \ x90 \ x81 \ xa4json \ xc4W {\” type \“:1,\” target \“: \“ ReceiveMessage \”,\“ arguments \”:[{\“ user \”:\“ user \”,\“ message \”:\“ message \”}]} \\ 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]“发布”“ SignalRCore.Hubs.ChatHub:all”“ {\” type \“:1,\” target \“:\” ReceiveMessage \“,\”参数\ “:[{\\ user \”:\“ FromConsole \”,\“消息\”:\“消息\”}]“

有什么主意我该如何指定要发布的其他数据? 也许我应该使用更适合我的情况的东西,而不是ServiceStack.Redis

1 个答案:

答案 0 :(得分:0)

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和messagepack来.WriteBytes。页眉页脚名称计数...