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

时间:2014-05-08 19:59:48

标签: c# .net websocket signalr

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

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

我注意到,来自客户端的多个请求将由集线器处理并在完成时返回,例如,我发送请求等待10秒,然后另一个请求等待1秒。集线器将首先响应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 Sample。

 $(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());
        });
    });
});

2 个答案:

答案 0 :(得分:2)

关于运输方法:

您可以检查HubCallerContext.QueryString param transport

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

关于线程&amp;长期任务:

每个请求都将在一个单独的线程上处理,并且集线器管道在hub方法完成时解析客户端promise。这意味着您可以轻松阻止连接,因为浏览器中的连接限制(通常一次只有6个连接)。

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

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

答案 1 :(得分:0)

对于ASP.NET Core;

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