使用WebSockets时如何将当前URL传递到.NET Core中的SignalR Hub?

问题描述 投票:0回答:1

我正在 Angular 前端和 .NET Core 后端中使用 SignalR。建立 SignalR 连接时,我需要将当前页面 URL 从客户端传递到服务器。最初,我尝试使用 IHttpConnectionOptions 中的 headers 选项将其作为自定义标头发送,但 WebSocket 似乎不支持自定义标头,因为 Page-Url 标头在服务器端不可用。

这是我的客户端代码和服务器端:

this.hubConnection = new signalR.HubConnectionBuilder()
  .withUrl(apiUrl + 'sharedconnectionhub', {
    accessTokenFactory: () => accessToken,
    headers: {
      'Page-Url': window.location.href // Tried sending the current page URL here
    },
    transport: signalR.HttpTransportType.WebSockets
  })
  .withAutomaticReconnect()
  .build();



public class MyHub : Hub
{
    public override async Task OnConnectedAsync()
    {
        var httpContext = Context.GetHttpContext();
        if (httpContext != null)
        {
            var pageUrl = httpContext.Request.Headers["Page-Url"].ToString();
            Console.WriteLine($"Page URL: {pageUrl}");
        }
        
        await base.OnConnectedAsync();
    }
}

但是,使用 WebSocket 时我在服务器上看不到 Page-Url 标头。

我的问题: 有没有办法在 SignalR 中使用 WebSockets 传递自定义标头(例如当前页面 URL)? 如果 WebSockets 不支持自定义标头,那么在 SignalR 连接期间传递当前 URL 或其他自定义数据的最佳替代方法是什么?

我尝试过的: 使用标头传递页面 URL(适用于 HTTP 传输,但不适用于 WebSockets)。 从服务器上的 httpContext.Request.Headers 检索 URL,但该值不存在。

angular asp.net-core websocket signalr httpcontext
1个回答
0
投票

你可以试试这个:

角度:

this.hubConnection = new signalR.HubConnectionBuilder()
     .withUrl(apiUrl + 'sharedconnectionhub' + window.location.href , {
      accessTokenFactory: () => accessToken,

     },
     transport: signalR.HttpTransportType.WebSockets
 })
 .withAutomaticReconnect()
 .build();

在 C# 中:

 private readonly IHttpContextAccessor _httpContextAccessor;
    public ChatHub(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
        url = _httpContextAccessor.HttpContext.Request.QueryString.ToString().Split("=")[1].ToString().Split("&")[0];
    }
© www.soinside.com 2019 - 2024. All rights reserved.