gpt4 book ai didi

sql - 是否可以将 SignalR 消息直接添加到 SQL 背板?

转载 作者:行者123 更新时间:2023-12-02 01:30:26 32 4
gpt4 key购买 nike

我想知道是否可以将 SignalR 消息直接添加到 SignalR SQL 背板(来自 SQL),这样我就不必使用 SignalR 客户端来执行此操作。

我的情况是,我有一个已激活的 SQL Service Broker 队列存储过程,当它触发时,我想向 SignalR 客户端发布一条消息。目前,我必须在单独的进程中从 SQL Service Broker 接收消息,然后立即使用 SignalR 集线器重新发送消息。

我希望激活的存储过程基本上将消息直接移动到 SignalR SQL 背板上。

最佳答案

是和否。我在本地主机上设置了一个小实验来确定是否可能 - 如果格式正确,确实如此。

现在,介绍一下[SignalR] 架构。它生成三个表:

[SignalR].[Messages_0] 
--this holds a list of all messages with the columns of
--[PayloadId], [Payload], and [InsertedOn]
[SignalR].[Messages_0_Id]
--this holds one record of one field - the last Id value in the [Messages_0] table
[SignalR].[Scehma]
--No idea what this is for; it's a 1 column (SchemaVersion) 1 record (value of 1) table

对,所以,我复制了最后一列,只是增加了 PayloadId (对于新记录,在 [Messages_0_Id] 中并放入 GETDATE() 作为 InsertedOn 的值。添加记录后,连接的客户端立即收到一条新消息。请注意,PayloadId 不是身份列,因此您必须手动递增它,并且您必须将该递增的值复制到 [Messages_0_Id] 中的唯一记录中,否则您的信号器客户端将由于 Signalr SQL 错误而无法连接。

现在,技巧是正确填充 [Payload] 列。快速查看该表表明它可能是二进制序列化的。我不是 SQL 专家,但我很确定执行二进制序列化会很困难。如果我是对的,这是二进制序列化的源代码,位于 Microsoft.AspNet.SignalR.Messaging.ScaleoutMessage 内:

public byte[] ToBytes()
{
using (MemoryStream memoryStream = new MemoryStream())
{
BinaryWriter binaryWriter = new BinaryWriter((Stream) memoryStream);
binaryWriter.Write(this.Messages.Count);
for (int index = 0; index < this.Messages.Count; ++index)
this.Messages[index].WriteTo((Stream) memoryStream);
binaryWriter.Write(this.ServerCreationTime.Ticks);
return memoryStream.ToArray();
}
}

使用WriteTo:

public void WriteTo(Stream stream)
{
BinaryWriter binaryWriter = new BinaryWriter(stream);
string source = this.Source;
binaryWriter.Write(source);
string key = this.Key;
binaryWriter.Write(key);
int count1 = this.Value.Count;
binaryWriter.Write(count1);
ArraySegment<byte> arraySegment = this.Value;
byte[] array = arraySegment.Array;
arraySegment = this.Value;
int offset = arraySegment.Offset;
arraySegment = this.Value;
int count2 = arraySegment.Count;
binaryWriter.Write(array, offset, count2);
string str1 = this.CommandId ?? string.Empty;
binaryWriter.Write(str1);
int num1 = this.WaitForAck ? 1 : 0;
binaryWriter.Write(num1 != 0);
int num2 = this.IsAck ? 1 : 0;
binaryWriter.Write(num2 != 0);
string str2 = this.Filter ?? string.Empty;
binaryWriter.Write(str2);
}

因此,用纯 SQL 在存储过程中重新实现它几乎是不可能的。如果您需要在 SQL Server 上执行此操作,我建议使用 SQL CLR functions 。不过,有一点值得一提 - 使用类库很容易,但如果您想长期减少麻烦,我建议在 Visual Studio 中创建一个 SQL Server 项目。这将使您能够比手动将最新的类库重新复制到 SQL Server 更轻松地自动部署 CLR 函数。 This page更多地讨论了如何做到这一点。

关于sql - 是否可以将 SignalR 消息直接添加到 SQL 背板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23935509/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com