gpt4 book ai didi

c# - SignalR:是否可以在建立连接时强制连接在服务器端使用特定传输?

转载 作者:行者123 更新时间:2023-11-30 13:56:31 30 4
gpt4 key购买 nike

在使用 SignalR 开发服务器客户端推送机制时,我遇到了最大并发连接数问题。 IE。每个浏览器进程仅支持大约 6 个到同一域的并发连接。

我目前正在跟踪哪些用户与哪些连接相关联,并且在用户拥有三个打开的​​连接后,我想强制来自同一用户的其他连接使用长轮询进行传输,而不是网络套接字。通过这种方式,我希望完全避免连接耗尽的问题。

我总是可以在客户端上执行此操作,服务器提供非 SignalR 机制以通知客户端是否已用完 Web 套接字连接,然后客户端可以在打开 SignalR 连接时指定长轮询,但这似乎效率低下.我真的很想在连接打开时适本地设置传输。

在 hub 类中类似下面的内容。

    /// <summary>
/// Chooses the correct transport depending on a users connections
/// </summary>
public override Task OnConnected()
{
if(CanOpenWebSocketsConnection(Context.User.Identity.Name))
{
Connection.Transport = Connections.WebSockets;
}
else
{
Connection.Transport = Connections.LongPolling;
}
return base.OnConnected();
}

最佳答案

作为传统的 longPolling 和 iFrame 机制,SignalR 传输类型是由 Client 而非 Server 发起的。 SignalR 只是这些传输类型的包装器。这个问题的解决方法是让服务器告诉客户端使用特定类型重新连接。

服务器代码:

[HubName("moveShape")]
public class MoveShapeHub : Hub
{
public override Task OnConnected()
{
if (Context.QueryString["transport"] == "webSockets")
{
return Clients.Caller.changeTransport("longPolling");
}
}
}

客户端代码:

var hubConnection = new HubConnection("http://localhost:1235/");
var hub = hubConnection.CreateHubProxy("moveShape");

hub.On<string>("changeTransport", transportName =>
Dispatcher.InvokeAsync(() =>
{
if (transportName == "longPolling")
{
hubConnection.Stop();
hubConnection.Start(new LongPollingTransport());
}
}));

await hubConnection.Start();

我已经测试了这个解决方案。它在 SignalR v2.2 下工作。 Here是我的 Github 示例项目。 (不知何故,在 SignalR v0.5.2 下,hubConnection 一旦停止就不会重新启动)。

关于c# - SignalR:是否可以在建立连接时强制连接在服务器端使用特定传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27548586/

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