Отправить идентификатор сеанса в основной подключенный метод SignalR

#c# #asp.net-core #razor-pages #asp.net-core-signalr

Вопрос:

Я пытаюсь отправить идентификатор сеанса ASP.NET Приложение Core 5, использующее страницы Razor для моего основного концентратора SignalR. Однако идентификатор сеанса добавляется только в запрос согласования, а не в фактический веб-сайт, который открывается:

Запросы

Как я могу добавить его также в запрос sessionsHub, который используется методом OnConnected() в концентраторе?

Страница бритвы .cs:

 public class IndexModel : PageModel
{
    private readonly HttpContext _httpContext;
    public string SessionId { get; set; }
    public IndexModel(IHttpContextAccessor httpContextAccessor)
    {

        _httpContext = httpContextAccessor.HttpContext;
    }
    public async Task OnGet()
    {
        SessionId = _httpContext.Session.Id;
    }
}
 

.cshtml, используя строку запроса, я также попытался добавить идентификатор сеанса в качестве заголовка запроса, тот же результат:

 @page
@model IndexModel
<script type="text/javascript">
    var sessionId = "@Model.SessionId";
class CustomHttpClient extends signalR.DefaultHttpClient {
    send(request) {
        var url = new URL(request.url);
        if(!url.search){
            url.href = url.href   '?sessionId="'   sessionId   '"';
        }else{
            url.href = url.href   'amp;sessionId="'   sessionId   '"';
        }
        request.url = url.href;
        return super.send(request);
    }
}
var connection = new signalR.HubConnectionBuilder().withUrl("/sessionsHub", { httpClient: new CustomHttpClient() }).build();
connection.start().then(() => {
}).catch(function (err) {
    return console.error(err.toString());
});
</script>
 

Центр:

 public class SessionHub : Hub{

    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
            
        string sessionId = GetSessionId();
    }

    private string GetSessionId()
    {
        HttpContext httpContext = Context.GetHttpContext();
        List<StringValues> sessionIdQueryString = httpContext.Request.Query.Where(x => x.Key == "sessionId").Select(x => x.Value).ToList();
        if (sessionIdQueryString.Count == 0)
        {
            throw new NullReferenceException();
        }

        string sessionId = sessionIdQueryString.First();
        
return sessionId;
    }
}
 

Ответ №1:

Вам необходимо ввести значение sessionid внутри URL-адреса при создании подключения. чтобы к нему можно было получить доступ во всех методах концентратора, код будет выглядеть следующим образом :

 var connection = new signalR.HubConnectionBuilder()
        .withUrl("/sessionsHub/?sessionId=@Model.SessionId")
        .build();

       connection.start().then(function(){
       //ToDo
        }).catch(function (err) {
        console.log(err);
       });
 

Комментарии:

1. Это действительно решение! Жаль, что об этом не написано в документации, хотя…