2013-07-08 11 views
11

To jest mój kod Hub:metoda połączenia Hub w C# kodu

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); 
     } 
     } 

chcę wywołać tej metody w innym projekcie z tym kodem:

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

chcę zadzwonić PushToOtherInGroup, gdy wywołanie metody Nie dostaję żadnego błędu. Ale popychacz nie działa.

To jest mój kod 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; 
      }; 
     }); 

Jaki jest mój problem?

Odpowiedz

17

Nie można utworzyć wystąpienia i nazywają klasę piasty bezpośrednio tak. Wokół klasy Hub w środowisku wykonawczym SignalR znajduje się wiele elementów hydraulicznych, które omijają, używając go jako "zwykłej klasy".

Jedynym sposobem interakcji z ośrodkiem SignalR z zewnątrz jest uzyskanie instancji obiektu IHubContext, która reprezentuje koncentrator w środowisku wykonawczym SignalR. Możesz to zrobić tylko w ramach tego samego procesu, tak długo, jak długo twój inny "projekt" będzie działał z kodem SignalR, zadziała.

Jeśli twój drugi projekt będzie działał w innym procesie, to co chcesz zrobić, to narazić się na pewien rodzaj "towarzysza" API, który jest albo innym ośrodkiem SignalR, albo zwykłą starą usługą sieciową (z siecią ASP.NET API), które możesz wywołać z tej innej aplikacji, aby wywołać pożądane zachowanie. Bez względu na to, którą technologię wybierzesz, prawdopodobnie będziesz chciał to zabezpieczyć, aby zadzwonić tylko do twoich uwierzytelnionych aplikacji.

Po zdecydować, które podejście masz zamiar wziąć, wszystko byłoby zrobić, aby wysyłać wiadomości za pośrednictwem koncentratora Pusher byłoby:

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

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

Jeśli chcesz wywołać metodę w swoim koncentratorze z innego projektu, musi ona znajdować się w tej samej domenie aplikacji. Jeśli tak oto w jaki sposób można to zrobić:

Call a hub method from a controller's action (nie przeszkadza tytuł, to działa za scenariusz)

1

Spójrz na this linku w temacie (Jak wywoływać metody klienta i zarządzać grupami spoza klasy Hub).
Przykładowy kod po prostu tworzy pojedynczą instancję klasy wywołującej i przekazuje do jej konstruktora IHubContext. Następnie masz dostęp do żądanych context.Clients metod klasy dzwoniącego:

// 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); 
     } 
    } 
}