gpt4 book ai didi

signalr - SignalR 是否提供消息完整性机制以确保在客户端重新连接期间不会丢失任何消息

转载 作者:行者123 更新时间:2023-12-04 11:51:16 33 4
gpt4 key购买 nike

抽象的
嗨,我在考虑是否可以使用 SignalR 发送消息。假设客户端断开连接,但最终在很短的时间内(例如 3 秒)重新连接。客户端会在断开连接时收到所有发送给他的消息吗?
例如,让我们考虑 LongPolling 传输。据我所知,长轮询是一个简单的 http 请求,由客户端提前发出,以等待服务器事件。
一旦服务器事件发生,数据就会在 http 请求上发布,这会导致在发出的 http 请求上关闭连接。之后,客户端发出新的 http 请求,再次重复整个循环。
问题
假设服务器上发生了两个事件,第一个 A然后 B (几乎立即)。客户端收到消息 A这导致关闭 http 连接。现在收到消息 B客户端必须发出第二个 http 请求。

如果B当客户端与服务器断开连接并尝试重新连接时发生了事件。
客户端会收到B吗?消息,或者我必须发明某种机制来确保消息完整性?
该问题不仅适用于长轮询,还适用于客户端重新连接的一般情况。
附言
我在服务器端使用 SignalR 集线器。

编辑 :
我发现无法保证消息的顺序,我无法使 SignalR 松散消息

最佳答案

这个问题的答案就在于这里的 EnqueueOperation 方法...

https://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Core/Transports/TransportDisconnectBase.cs

protected virtual internal Task EnqueueOperation(Func<object, Task> writeAsync, object state)
{
if (!IsAlive)
{
return TaskAsyncHelper.Empty;
}

// Only enqueue new writes if the connection is alive
Task writeTask = WriteQueue.Enqueue(writeAsync, state);
_lastWriteTask = writeTask;

return writeTask;
}

当服务器向客户端发送消息时,它会调用此方法。在上面的示例中,服务器会将要发送的 2 条消息排入队列,然后客户端将在收到第一条消息后重新连接,然后将发送第二条消息。

如果服务器排队并发送第一条消息并且客户端重新连接,则有一个小窗口,第二条消息可能会尝试在连接不事件的情况下排队,并且消息将在服务器端丢弃。然后在重新连接后,客户端不会收到第二条消息。

希望这可以帮助

关于signalr - SignalR 是否提供消息完整性机制以确保在客户端重新连接期间不会丢失任何消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27213277/

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