我正在 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,但该值不存在。
你可以试试这个:
角度:
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];
}