Почему Signalr не стабильный все время? - PullRequest
0 голосов
/ 10 октября 2019

Я работаю с проектом сигнализатора с использованием .Net Framework 4.6. И у меня есть базовый контроллер:

public abstract class Base<THub> : ApiController where THub : IHub
{
    private static readonly Func<IHubContext> ValueFactory = () => GlobalHost.ConnectionManager.GetHubContext<THub>();

    private readonly Lazy<IHubContext> hub = new Lazy<IHubContext>(ValueFactory);

    protected IHubContext Hub => hub.Value;
}

ТАК Я создаю свой контроллер уведомлений из базы.

public class NewsController : Base<NotificationHub>{
     public async Task<IHttpActionResult> CreateNews(string name){
        // connect database
        // create news on database
        ....

        Hub.Clients.All.send(name);     
     }
}

И я подключаю этот концентратор из моего настольного приложения. Я создаю новости, используя действие CreateNews (имя строки), это действие отправляет уведомление с первых нескольких попыток. И затем он не отправляет несколько попыток, а через несколько раз снова отправляет уведомление клиенту.

[HubName("notification")]
public class NotificationHub: Hub
{
    private static readonly ConnectionMapping<string> Connections = new ConnectionMapping<string>();

    public override Task OnConnected()
    {
        var name = Context.User.Identity.Name;

        Connections.Add(name, Context.ConnectionId);

        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        var name = Context.User.Identity.Name;

        Connections.Remove(name, Context.ConnectionId);

        return base.OnDisconnected(stopCalled);
    }

    public override Task OnReconnected()
    {
        var name = Context.User.Identity.Name;

        if (!Connections.GetConnections(name).Contains(Context.ConnectionId))
        {
            Connections.Add(name, Context.ConnectionId);
        }

        return base.OnReconnected();
    }
}

Я установил точки останова в моем настольном клиенте, нет ошибок или сбоев подключения. Это всегда работает. Но уведомления не отправляются все время под названием действие CreateNews (имя строки).

Каковы возможные причины?

1 Ответ

0 голосов
/ 10 октября 2019

Каждый раз, когда запускается ваше настольное приложение, вам нужно добавить этот connectionid в объект класса-концентратора. поэтому вам нужно реализовать свой объект signalR и в настольном приложении.

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

так что вам нужно реализовать signalR обе стороны.

...