Метод вызова Hub в коде С#

Это мой код Hub:

   public class Pusher : Hub, IPusher
        {
            readonly IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>();

   public virtual Task PushToOtherInGroup(dynamic group, dynamic data)
        {
            return _hubContext.Clients.Group(group).GetData(data);
        }
      }

Я хочу вызвать этот метод в другом проекте с помощью этого кода:

   var pusher = new Pusher.Pusher();
       pusher.PushToOtherInGroup("Test", new {exchangeTypeId, price});

Мне нужен вызов PushToOtherInGroup, при вызове метода я не получаю никакой ошибки. но толкатель не работает.

Это мой код Ui:

$(function() {
    hub = $.connection.pusher;
    $.connection.hub.start()
        .done(function() {
            hub.server.subscribe('newPrice');
            console.log('Now connected, connection ID=' + $.connection.hub.id);
        })
        .fail(function() { console.log('Could not Connect!'); });
});

  (function() {
            hub.client.GetData = function (data) {
                debugger;
            };
        });

В чем моя проблема?

Ответ 1

Вы не можете создать экземпляр и вызвать класс концентратора непосредственно так. Существует много сантехники, предоставляемых вокруг класса концентратора во время выполнения SignalR, которое вы обходите, используя его как "простой старый класс".

Единственный способ взаимодействия с концентратором SignalR извне - фактически получить экземпляр IHubContext, который представляет концентратор из среды выполнения SignalR. Вы можете сделать это только из одного процесса, так что пока ваш другой "проект" будет запущен в процессе с кодом SignalR, он будет работать.

Если ваш другой проект будет запущен в другом процессе, то то, что вы хотите сделать, представляет собой своего рода "сопутствующий" API, который является либо другим концентратором SignalR, либо обычной старой веб-службой (с веб-интерфейсом ASP.NET), которую вы можете вызвать из этого другого приложения, чтобы вызвать поведение, которое вы хотите. Какую бы технологию вы ни выбрали, вы, вероятно, захотите ее защитить, чтобы ее могли называть только ваши аутентифицированные приложения.

Как только вы решите, какой подход вы собираетесь предпринять, все, что вы сделали бы, чтобы отправлять сообщения через концентратор Pusher, будет:

// Get the context for the Pusher hub
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>();

// Notify clients in the group
hubContext.Clients.Group(group).GetData(data);

Ответ 2

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

Вызовите метод хаба из действия контроллера (не против названия, оно работает для вашего сценария)

Ответ 3

Посмотрите эту ссылку по теме (Как вызвать методы клиентов и управлять группами извне класса Hub). < ш > Пример кода просто создает экземпляр singleton класса caller и передается в конструкторе IHubContext. Затем у вас есть доступ к желаемому context.Clients в методах класса вызывающего абонента:

// This sample only shows code related to getting and using the SignalR context.
public class StockTicker
{
    // Singleton instance
    private readonly static Lazy<StockTicker> _instance = new     Lazy<StockTicker>(() => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>()));

private IHubContext _context;

private StockTicker(IHubContext context)
{
    _context = context;
}

// This method is invoked by a Timer object.
private void UpdateStockPrices(object state)
{
    foreach (var stock in _stocks.Values)
    {
        if (TryUpdateStockPrice(stock))
        {
            _context.Clients.All.updateStockPrice(stock);
        }
    }
}