【问题标题】:SignalR ASP.Net Core offers no way to Add Context Items via Typescript ClientSignalR ASP.Net Core 无法通过 Typescript 客户端添加上下文项
【发布时间】:2019-09-02 15:41:00
【问题描述】:

我正在打开从我的 Typescript 客户端到我的 C# SignalR Hub 的连接。似乎没有办法添加上下文项。

客户:

  public startConnection(hubRoute: string): void {
    const fixedRoute = `${this._baseUrl}${hubRoute}`;
    this.hubConnection = new signalR.HubConnectionBuilder()
      .withUrl(fixedRoute)
      .build();

    this.hubConnection
      .start()
      .then(() => console.log('Connection started'))
      .catch(err => console.log('Error while starting connection: ' + err));

/// where and how to add context items here?
  }

服务器:

    public class EditorialHub: Hub<IEditorialHub>
    {
        public override async Task OnConnectedAsync()
        {
            if (Context.Items["IssueNumber"] is string issueNumber)
            {
                await Groups.AddToGroupAsync(Context.ConnectionId, "IssueNumber_" + issueNumber);

            }
            await  base.OnConnectedAsync();
        }

        public override async Task OnDisconnectedAsync(Exception exception)
        {
            if (Context.Items["IssueNumber"] is string issueNumber)
            {
                await Groups.RemoveFromGroupAsync(Context.ConnectionId, "IssueNumber_" + issueNumber);

            }
            await base.OnDisconnectedAsync(exception);
        }
    }

我可以从客户端添加“IssueNumber”Context.Item 吗?

【问题讨论】:

  • 这里的上下文是什么?你从哪里得到的?
  • 上下文是基类集线器的属性。
  • 所以你想让客户端发送上下文对象给信号器?
  • 正确。我找不到从客户端填充 Context.Items 的方法。
  • 我认为 Signalr 客户端不能这样做,因为那是服务器端对象

标签: c# typescript asp.net-core signalr asp.net-core-signalr


【解决方案1】:

我是这样做的,尽管在任何地方的文档中都找不到。 如果这是一个复杂的对象,您可以将任何您想要的集合传递给值(只需指定我放置字符串值的类型)。

public void SetContextItems(string key, string value)
{
   Context.Items.Add(key, value);
}

这是用于服务器端*。 对于客户端,您可以像 @Tony Ngo 那样调用此方法。

【讨论】:

    【解决方案2】:

    您可以像这样将数据从客户端发送到 SignalR 集线器

        public async Task Send(string userId)
        {
            var message = $"Send message to you with user id {userId}";
            await Clients.Client(userId).SendAsync("ReceiveMessage", message);
        }
    
        public string GetConnectionId()
        {
            return Context.ConnectionId;
        }
    

    我定义了 2 种方法 1 将消息从服​​务器发送到客户端名称 Send 和 1 方法从客户端接收消息发送到服务器

    在js代码中

    import * as signalR from "@aspnet/signalr";
    
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/hub")
        .build();
    
    connection.start().then(function () {
                console.log("connected");
    
                connection.invoke('getConnectionId')
                    .then(function (connectionId) {
                        sessionStorage.setItem('conectionId', connectionId);
                        // Send the connectionId to controller
                    }).catch(err => console.error(err.toString()));;
            });
    
            $("#sendmessage").click(function () {
                var connectionId = sessionStorage.getItem('conectionId');
                connection.invoke("Send", connectionId);
            });
    
            connection.on("ReceiveMessage", function (message) {
                console.log(message);
            });
    

    connection.invoke('getConnectionId') 将是从客户端向服务器发送数据的方法

    connection.on("ReceiveMessage" 将是接收从客户端发送到服务器的消息的消息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2020-04-27
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多