с использованием основного клиента signalR .net

Я установил ядро ​​.net веб-сайта signalR. Моя функция в моем хабе:

public async Task Notify(int id) {
    await Clients.All.InvokeAsync("Notified", id);
}

Я также тестировал это с помощью следующих js:

let connection = new signalR.HubConnection(myURL);

    connection.on('Notified', data => {
        console.log(4, data);
    });

    connection.start();

Код js работает нормально, и я вижу журнал, когда пытаюсь connection.Invoke('Notify').

Теперь у меня есть консольное приложение, которое может вызывать. Я пытаюсь сделать это двумя способами и не возражаю против любого из решений: 1. Контроллер mvc на веб-сайте signalR, который может принимать идентификатор и вызывать 'Notified'. 2. Используйте клиентскую библиотеку Microsoft.AspNetCore.SignalR.Client в консольном приложении.

Способ 1, который я сделал только в классическом asp.net, вот так:

GlobalHost.ConnectionManager.GetHubContext(hubName)

Но не смог найти способ сделать это в ядре .net.

Способ 2 Я использовал библиотеку и пробовал это до сих пор:

var con = new HubConnectionBuilder();
con.WithUrl(myURL);      
var connection = con.Build();
connection.InvokeAsync("Notify",args[0]).Wait();

Я подошел ближе всего к созданию соединения таким же образом, как и в js-коде. Однако этот код выдает нулевой указатель при вызове connection.InvokeAsync. Объект connection не равен нулю. Кажется, это внутренний объект с нулевым значением. Согласно трассировке стека, исключение выдается при внутреннем вызове функции MoveNext ().


person Neville Nazerane    schedule 19.09.2017    source источник


Ответы (2)


Похоже, что оба варианта в настоящее время невозможны. На данный момент я просто использовал принудительный способ, который, надеюсь, временный.

Я создал и использовал следующий базовый класс для концентраторов:

public abstract class MyHub : Hub
{

    private static Dictionary<string, IHubClients> _clients = new Dictionary<string, IHubClients>();

    public override Task OnConnectedAsync()
    {
        var c = base.OnConnectedAsync();
        _clients.Remove(Name);
        _clients.Add(Name, Clients);
        return c;
    }

    public static IHubClients GetClients(string Name) {
        return _clients.GetValueOrDefault(Name);
    }
}
person Neville Nazerane    schedule 21.09.2017
comment
В соответствии с моим ответом вы вводите IHubContext замену GlobalHost - вот код: github.com/ aspnet / SignalR / issues / 884 - person Pawel; 12.10.2017
comment
РЖУ НЕ МОГУ! что с -1? это НЕ РАБОТАЕТ для кого-то? - person Neville Nazerane; 14.10.2017
comment
Ответ неверен - в нем говорится, что оба варианта невозможны, в то время как первое на самом деле возможно, а второе, вероятно, вызвано попыткой отправки без запуска соединения. По-прежнему ошибка в SignalR (обратите внимание, что мы говорим об альфа-версии), но без запуска соединения вы не можете ожидать, что что-нибудь будет отправлено. (полная трассировка стека для исключения NullReferenceException будет полезна при указании места проблемы и поможет исправить код, чтобы он работал). - person Pawel; 14.10.2017
comment
Как вы ясно заметили, этот метод ЗАМЕНЯЕТ GlobalHost. Это не замена класса, а процесс замены класса. Когда я сказал, что это невозможно, я имел в виду, что прямой замены класса не существует. Мой код здесь тоже является заменой процесса GlobalHost. Это не делает ответ неверным. - person Neville Nazerane; 14.10.2017

  1. GlobalHost больше нет. Вам необходимо ввести IHubContext<THub>, как в this sample.

  2. Это может быть ошибкой в ​​SignalR alpha1. Можете ли вы сообщить о проблеме на https://github.com/aspnet/signalr и включить упрощенное воспроизведение ?

person Pawel    schedule 21.09.2017