我们有一个要求,一个用户可以有两个同时运行的信号中心请求(因为其中一个请求需要很长时间才能运行)。似乎最新版本的signalr-core请求已排队,第二个请求仅在第一个请求完成后才开始执行。
我已经建立了一个测试用例来重现此问题,并且似乎可以通过在客户端上创建2个HubConnection对象来解决该问题,但是将它们一直打开并不理想。允许使用此功能,我怀疑这是否是预期的行为,这可能是我无法轻松执行此操作的原因。
我们还在以前的项目中使用了此功能,该项目使用的是较旧的signalr(而不是signalr-core),并且此功能似乎有效,因此降级signalr也是可能的。
中心代码:
public class TestHub: Hub
{
Random r = new Random();
public async Task SlowTask()
{
await Task.Delay(5000);
await Clients.Caller.SendAsync("slowNumber", r.Next());
}
public async Task FastTask()
{
await Task.Delay(5);
await Clients.Caller.SendAsync("fastNumber", r.Next());
}
}
客户代码:
function GetWebSocketHub(hubUrl: string): HubConnection {
const connection = new HubConnectionBuilder()
.withUrl(hubUrl)
.configureLogging(LogLevel.Debug)
.build();
connection.start();
return connection;
}
export class TestComponent extends React.Component {
connection1: HubConnection;
connection2: HubConnection;
constructor(props: any) {
super(props);
this.connection1 = GetWebSocketHub("/hubs/test");
this.connection2 = GetWebSocketHub("/hubs/test");
}
fastWebService = () => {
this.connection1.send("fastTask");
}
slowWebService = () => {
this.connection2.send("slowTask");
}
render() {
return (
<div>
<button onClick={() => this.fastWebService()}>Fast</button>
<button onClick={() => this.slowWebService()}>Slow</button>
</div>
);
}
}
在chrome中打开开发工具后,在网络标签中,两次单击慢速请求,我希望看到响应会在相似的时间返回,但似乎只在第一个请求完成时才开始请求。在此示例中,快速请求正在使用其他HubConnection,因此在慢速记录运行时可以正常通信。