AspNetCore.SignalR SendAsync не запускается внутри OnConnectedAsync - PullRequest
0 голосов
/ 23 января 2019

У меня возникла проблема, из-за которой я хотел бы отправлять событие на внешний интерфейс всякий раз, когда кто-то подключен к концентратору, но уведомление на внешнем интерфейсе не принимается.Я думаю, что я могу быть запутан между вызовом методов непосредственно из концентратора и использованием IHubContext.Мне не удалось найти много информации, связанной с этими версиями, поэтому ваша помощь будет принята с благодарностью!

Версии пакета:

Server side (.Net Core 2.2): Microsoft.AspNetCore.SignalR (1.1.0)
Client side (React): @aspnet/signalr:1.1.0

Итак, это мой пример Hub:

public class MyHub: Hub<IMyHub>
{
    public override async Task OnConnectedAsync()
    {
        // This newMessage call is what is not being received on the front end
        await Clients.All.SendAsync("newMessage", "test");

        // This console.WriteLine does print when I bring up the component in the front end.
       Console.WriteLine("Test");

        await base.OnConnectedAsync();
    }

    public Task SendNewMessage(string message)
    {
        return Clients.All.SendAsync("newMessage", message);
    }
}

Теперь мой рабочий вызов находится в службе, но он отправляет "newMessage" следующим образом:

public class MessageService: IMessageService
{
    private readonly IHubContext<MyHub> _myHubContext;

    public MessageService(IHubContext<MyHub> myHubContext)
    {
        _myHubContext = myHubContext;
    }

    public async Task SendMessage(string message)
    {
        // I noticed tis calls SendAsync from the hub context, 
        // instead of the SendMessage method on the hub, so maybe
        // the onConnectedAsync needs to be called from the context somehow also?
        await _myHubContext.Clients.All.SendAsync("newMessage", message);
    }
}

Таким образом, приведенный выше вызов метода службы работает и свяжется с внешним интерфейсом.Это пример моего внешнего интерфейса в компоненте реакции:

const signalR = require('@aspnet/signalr');

class MessageComponent extends React.Component {
    connection: any = null;

    componentDidMount() {
        this.connection = new signalR.HubConnectionBuilder()
            .withUrl('http://localhost:9900/myHub')
            .build();

        this.connection.on('newMessage', (message: string) => {
            // This works when called from the service IHubContext
            // but not OnConncectedAsync in MyHub
            console.log(message);
        });

        this.connection.start();
    }

    componentWillUnmount() {
        this.connection.stop();
    }

    render() {
        ...
    }
}

1 Ответ

0 голосов
/ 25 января 2019

Это потому, что вы используете сильно типизированный концентратор (https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-2.2#strongly-typed-hubs).

Я предполагаю, что вы определили SendAsync на вашем IMyHub интерфейсе, и поэтому сервер отправляет сообщение с method = SendAsync, arguments = "newMessage", "test". ЕслиВы удалили свой IMyHub тип, тогда он будет работать как положено.

...