如何确定信号R正在使用哪种传输方法

本文关键字:传输 方法 何确定 信号 | 更新日期: 2023-09-27 18:02:21

我正在编写一个带有信号r服务器和web客户端的测试应用程序,我想知道是否有一种方法可以确定或让服务器知道客户端正在与服务器建立哪种传输方法。

关于在客户端和服务器之间有一个持久的双向连接的websockets或长轮询,保持轮询服务器,直到服务器响应,然后关闭连接,是否有任何缺点,我必须意识到关于传输方法不是持久的双向连接之外的web套接字,特别是如果有许多长时间运行的请求一个接一个?

我注意到,从客户端发出多个请求将由集线器处理并在完成时返回,例如,我发送一个请求等待10秒,然后另一个请求等待1秒。Hub将首先响应1秒等待请求,然后响应10秒延迟,我很好奇每个请求是否有一个线程通过相同的持久双工连接附加到客户端。

这里是我的示例代码。

class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR();
    }
}
public class RunningHub : Hub
{        
    public void SendLongRunning(string name, string waitFor)
    {
        Clients.All.addMessage(name, "just requested a long running request I'll get back to you when im done");
        LongRunning(waitFor);
        Clients.All.addMessage(name, "I'm done with the long running request. which took " + waitFor + " ms");
    }
    private void LongRunning(string waitFor)
    {
        int waitTime = int.Parse(waitFor);
        Thread.Sleep(waitTime);            
    }
}

JQuery示例。

 $(function () {
    //Set the hubs URL for the connection
    $.connection.hub.url = "http://localhost:9090/signalr";
    // Declare a proxy to reference the hub.
    var signalHub = $.connection.runningHub;
    $('#url').append('<strong> Working With Port: ' + $.connection.hub.url + '</strong>');
    // Create a function that the hub can call to broadcast messages.
    signalHub.client.addMessage = function (name, message) {
       //handles the response the message here
    };
    // Start the connection.
    $.connection.hub.start().done(function () {
         $('#sendlongrequest').click(function() {
            signalHub.server.sendLongRunning($('#displayname').val(), $('#waitTime').val());
        });
    });
});

如何确定信号R正在使用哪种传输方法

核心网;

var transportType = Context.Features.Get<IHttpTransportFeature>()?.TransportType;

关于传输方法:

您可以检查HubCallerContext.QueryString参数transport:

public void SendLongRunning(string name, string waitFor)
{
    var transport = Context.QueryString.First(p => p.Key == "transport").Value;
}

关于线程&长时间运行任务:

每个请求将在一个单独的线程上处理,hub管道在hub方法完成时解析客户端承诺。这意味着你可以很容易地阻止你的连接,因为浏览器的连接限制(通常一次6个连接)。

。:如果您使用长轮询并向服务器发出6个请求,每个请求触发(或直接执行)一个长时间运行的操作,那么您将有6个等待的AJAX请求,这些请求只有在hub方法完成后才能得到解决,并且在此之前您将无法向服务器发出任何进一步的请求。因此,您应该为长时间运行的代码使用单独的任务,并且您也不应该等待这些任务,以便集线器调度程序可以毫无延迟地发送其响应。

如果客户端需要知道长时间运行的任务何时完成,那么您应该从服务器执行推送通知,而不是依赖于.done()回调。