【问题标题】:SignalR Core How to get a connection parameter server sideSignalR Core 如何获取服务器端的连接参数
【发布时间】:2019-03-03 15:36:05
【问题描述】:

按照这个答案How to send Parameter/Query in HubConnection SignalR Core

我正在设置客户端:

const connectionHub = new HubConnectionBuilder()
.withUrl(Constants.URL_WEB_SOCKET + '?token=123')
.build();

但是服务器端如何获取token值呢?

public override async Task OnConnectedAsync()
{
    _connectionId = Context.ConnectionId;

    var token = Context.Items["token"]; // this is null

    var token2 = Context.QueryString["token"]; // 'HubCallerContext' does not contain a definition for 'QueryString' 

    await base.OnConnectedAsync();
 }

【问题讨论】:

    标签: .net-core signalr


    【解决方案1】:

    如果要在.net core中获取token值,可以使用如下代码:

    var httpContext = Context.GetHttpContext();
    var tokenValue = httpContext.Request.Query["token"];
    

    【讨论】:

      【解决方案2】:

      您可以在 QueryString 中发送参数。

      在您的客户端中,声明一个字符串字典和连接

      private Dictionary<string, string> _querystringdata = new Dictionary<string, string>();
      private HubConnection _connection;
      private const string HubUrl = "your hub url";
      

      然后,分配您要发送的值

       _querystringdata.Add("key", "Value");
       _connection = new HubConnection(HubUrl, _querystringdata);
      

      开始连接

      if (_connection.State == ConnectionState.Disconnected)
              {
      
                  // Creating the signalrHub proxy
                  IHubProxy signalrHub = _connection.CreateHubProxy("SignalrHub");
                  Console.WriteLine("Initiating Connection");
                  // starting the signalr connection
                  _connection.Start().ContinueWith(task =>
                  {
                      if (task.IsFaulted)
                      {
                          Console.WriteLine("There was an error opening the connection:{0}", task.Exception.GetBaseException());
      
                      }
                      else
                      {
                          Console.WriteLine("Connected to server");
      
                          //Client methods which server can invoke
                          signalrHub.On<dynamic>("sendMessage", (data) =>
                          {
                              Console.WriteLine("Message:- {0}", data);
                              // do something
                          });
                      }
                  }).Wait(); 
              }
      

      然后在您的服务器 signalR 集线器类中

       public override Task OnConnected()
          {
              try
              {
                  // getting the value sent with query string
                  var token = Context.QueryString.Get("Key");
                  // do something like connection mapping etc
              }
              catch (Exception ex)
              {
                  Console.WriteLine(ex.ToString());
              }
              return (base.OnConnected());
          }
      

      【讨论】:

      • 不,Constants.URL_WEB_SOCKET 是我的网络套接字 URL(即localhost:4545/enginehub)。并且 Context 不包含 QueryString 的定义
      • 那是因为您没有在客户端中分配 QueryString。我已经更新了答案。希望这会有所帮助。
      猜你喜欢
      • 2014-01-21
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      相关资源
      最近更新 更多