C# 如何确定信号R使用的传输方法

C# 如何确定信号R使用的传输方法,c#,.net,websocket,signalr,C#,.net,Websocket,Signalr,我正在用signal r server和一个web客户端编写一个测试应用程序,我想知道是否有办法确定或让服务器知道客户端正在与服务器建立哪种传输方法 对于在客户端和服务器之间具有永久性双向连接的WebSocket,或者长轮询,它会一直轮询服务器,直到服务器响应,然后关闭连接,对于传输方法不是永久性双向连接之外的web套接字,我必须知道有什么缺点吗连接,尤其是当一个接一个地发出许多长时间运行的请求时 我注意到,从客户端发出多个请求将由中心处理,完成后返回,例如,我发送一个请求等待10秒,然后发送另

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

对于在客户端和服务器之间具有永久性双向连接的WebSocket,或者长轮询,它会一直轮询服务器,直到服务器响应,然后关闭连接,对于传输方法不是永久性双向连接之外的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示例

 $(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());
        });
    });
});
$(函数(){
//设置连接的集线器URL
$.connection.hub.url=”http://localhost:9090/signalr";
//声明代理以引用中心。
var signalHub=$.connection.runningHub;
$('#url').append('使用端口:'+$.connection.hub.url+'');
//创建一个中心可以调用以广播消息的函数。
signalHub.client.addMessage=函数(名称、消息){
//在此处处理消息的响应
};
//启动连接。
$.connection.hub.start().done(函数(){
$('#sendlongrequest')。单击(函数(){
sendLongRunning($('#displayname').val(),$('#waitTime').val());
});
});
});

关于运输方法:

您可以检查HubCallerContext.QueryString
param
transport

public void SendLongRunning(string name, string waitFor)
{
    var transport = Context.QueryString.First(p => p.Key == "transport").Value;
}
关于线程和长时间运行的任务:

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

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

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

For ASP.NET Core

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