Как передать некоторые данные через заголовок signalR или строку запроса в приложении .net core 2.0

Используя signalR в .net 4.7, мы смогли передать две переменные из клиентского приложения на сервер signalR. Вот фрагмент кода:

public class MyHub : Hub
{
    protected (string myVar1, string myVar2) GetValues() =>
            (
            Context.QueryString["MyVariable1"] ?? string.Empty,
            Context.QueryString["MyVariable2"] ?? string.Empty,
            );
}

Клиент javascript установит эти переменные следующим образом:

$.connection.hub.qs = {'MyVariable1' : 'val1', 'MyVariable2' : 'val2'};

Теперь мы пытаемся перейти на альфа-версию signalR для приложений .net core 2.0. Блокирует то, что мы больше не можем использовать этот метод для получения значений myVar1 и myVar2. Не доступен не только QueryString, но и заголовки. Как лучше всего преодолеть эту ситуацию, чтобы иметь возможность передавать переменные из клиентского приложения (Typescript) или даже из основного приложения .net на сторону сервера signalR? Также - как установить переменные на стороне клиента?


person Arash    schedule 18.09.2017    source источник


Ответы (2)


Вы можете получить доступ к HttpContext в своем хабе следующим образом:

var httpContext = Context.Connection.GetHttpContext();

а затем используйте httpContext.Request.Query["MyVariable"], чтобы получить значение переменной

Изменить для ASPNetCore 2.1 и более поздних версий

GetHttpContext() метод расширения напрямую доступен для Context объекта

using Microsoft.AspNetCore.Http.Connections;
....
var httpContext = Context.GetHttpContext();
person Pawel    schedule 18.09.2017
comment
Примечание для других: это метод расширения, поэтому вы не увидите его в списке, пока не включите пространство имен Microsoft.AspNetCore.SignalR. - person Sellorio; 23.10.2017
comment
Привет, не могли бы вы привести пример для вставки параметра в связи с С #? Я использую HubConnectionBuilder для создания и запуска подключения. - person Pedro Franco; 28.02.2018
comment
Просто добавьте параметр в строку запроса, которую вы передаете, чтобы начать соединение? - person Pawel; 28.02.2018
comment
Я все еще не вижу метод расширения со ссылкой на Microsoft.AspNetCore.SignalR? в .net core 2.1? - person Mark Redman; 15.08.2018
comment
Вероятно, вам не хватает оператора using. Вы можете найти этот метод расширения здесь. - person Pawel; 15.08.2018

Позднее присоединение к этой теме. Единственный способ заставить этот механизм работать в .net core 2.2 был:

# 1 Добавление двух пакетов Nuget

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Http.Connections" Version="1.1.0" />
    <PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="2.2.0" />
</ItemGroup>

# 2 Затем в наших методах pe OnConnectedAsync ():

    public override Task OnConnectedAsync()
    {
        var httpContext = Context.GetHttpContext();
        if (httpContext == null)
            throw new Exception("...");

        var query = httpContext.Request.Query;
        var userId = query.GetQueryParameterValue<long>("Foo");
        var clientId = query.GetQueryParameterValue<string>("Bar");
        var connectionId = Context.ConnectionId;

        [...]

        return base.OnConnectedAsync();
    }

# 3 Также представлены несколько удобных расширений SignalR:

    static public class SignalrExtensions
    {
       static public HttpContext GetHttpContext(this HubCallerContext context) =>
          context
            ?.Features
            .Select(x => x.Value as IHttpContextFeature)
            .FirstOrDefault(x => x != null)
            ?.HttpContext;

       static public T GetQueryParameterValue<T>(this IQueryCollection httpQuery, string queryParameterName) =>
          httpQuery.TryGetValue(queryParameterName, out var value) && value.Any()
            ? (T) Convert.ChangeType(value.FirstOrDefault(), typeof(T))
            : default;
    }

Надеюсь это поможет.

person XDS    schedule 29.03.2019