SignalR Client 开始连接时如何设置用户?

Posted

技术标签:

【中文标题】SignalR Client 开始连接时如何设置用户?【英文标题】:SignalR Client How to Set user when start connection? 【发布时间】:2015-06-13 02:25:27 【问题描述】:

服务器端:

public override Task OnConnected()

    var connectionId = Context.ConnectionId;
    var user = Context.User.Identity.Name; // Context.User is NULL
    return base.OnConnected();

客户端(在控制台项目中):

IHubProxy _hub;
string url = @"http://localhost:8080/";
var connection = new HubConnection(url);
_hub = connection.CreateHubProxy("TestHub");
connection.Start().Wait();

当客户端连接到服务器时,我想知道userName和connectionId之间的映射,但是Context.User是NULL。如何在客户端设置这个值?

【问题讨论】:

您使用哪种身份验证?如果您使用 ASP.NET 内置身份验证,它应该可以正常工作 我没有使用任何类型的身份验证...我只是构建了一个新的空项目并从 NuGet 下载信号器 你需要启用身份验证,然后 Context.User 才能工作 由于您使用.NET客户端,您还需要在客户端hubConnection.Credentials = CredentialCache.DefaultCredentials上设置credentails(此代码适用于Windows身份验证) 如果您使用的是 Azure SignalR 服务,请参阅 How to use SignalR to send data to a specific user? 【参考方案1】:

asp.netcore 2.1 中的 queryString 试试这个:

客户端 (javascript) 在 url 之后设置查询字符串,如下所示:

var connection = new signalR.HubConnectionBuilder().withUrl("http://localhost:10499/chathub?username=xxxx").build();
connection.start().then(function ()

    // do some thing here ...
).catch(function (err)

    console.error(err.toString());
);
.
.
.

服务器

public override Task OnConnectedAsync()
    
        var  username = Context.GetHttpContext().Request.Query["username"];
        // username = xxxx
        return base.OnConnectedAsync();
    

【讨论】:

我有a similar question,非常感谢您的帮助 这是我最能接受的一个。我尝试了所有其他方法,但无济于事。这需要一个双 +【参考方案2】:

使用查询字符串传递您的用户名。

客户

首先设置查询字符串

string url = @"http://localhost:8080/";
var connection = new HubConnection(url);
_hub = connection.CreateHubProxy("TestHub");
connection.qs =  'username' : 'anik' ;
connection.Start().Wait();

服务器

public override Task OnConnected()

    var username= Context.QueryString['username'];
    return base.OnConnected();

【讨论】:

我有 a similar question 并且非常感谢任何帮助 'HubConnection' 不包含 'qs' 的定义,并且找不到接受“HubConnection”类型的第一个参数的可访问扩展方法“qs”(您是否缺少 using 指令或程序集参考?) @HOÀNGLONG 旧 ASP.NET SignalR 还是新 ASP.NET Core SignalR?【参考方案3】:

客户

var connection = new HubConnection(<YOUR_URL>);
connection.Headers.Add("username", "maria");
var myHub = connection.CreateHubProxy("MyHub");

服务器

string username = Context.Headers.Get("username");
Console.WriteLine("New client connection - " + username);

【讨论】:

虽然这可能会回答问题,但您需要提及并解释更改以及更改原因。这将有助于 OP 了解并了解进行更改的原因和位置【参考方案4】:

试试这个

客户端 (C#)

       //Enter query string 
       var querystringData = new Dictionary<string, string>();
       querystringData.Add("username", "naveed");


       IHubProxy _hub;
       string url = @"http://localhost:8080/";
       var connection = new HubConnection(url);
       _hub = connection.CreateHubProxy("TestHub");
       connection.Start().Wait();
       connection.Start().Wait();

服务器

public override Task OnConnected()

  var connectionId = Context.ConnectionId;
  var username= Context.QueryString["username"]; //here you will receive naveed as username

  return base.OnConnected();

【讨论】:

以上是关于SignalR Client 开始连接时如何设置用户?的主要内容,如果未能解决你的问题,请参考以下文章

SignalR:服务器如何建立与客户端的连接?

SignalR 挂起开始连接

关于SignalR连接数量问题的记录

如何进行多平台部署Client和Server详细讲解

如何让 SignalR 连接尊重会话超时

signalR client属性中的大致方法