如何允许来自同一客户端的多个信号中心请求同时运行

时间:2019-04-08 09:07:58

标签: asp.net-core-signalr

我们有一个要求,一个用户可以有两个同时运行的信号中心请求(因为其中一个请求需要很长时间才能运行)。似乎最新版本的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,因此在慢速记录运行时可以正常通信。

0 个答案:

没有答案