2015-04-03 2 views
0

Я следил за этим руководством, ASP.NET SignalR Hubs API Guide (How to manage group membership from the Hub class) и все же не смог получить методы на стороне сервера ShipmentHub.Методы сервера регистрации группы SignalR не были удалены

Мой ShipmentHub класс выглядит следующим образом:

public class ShipmentHub : Hub 
{ 
    IShipmentLogic shipmentLogic; 

    public ShipmentHub(IShipmentLogic shipmentLogic) 
    { 
     this.shipmentLogic = shipmentLogic; 
    } 

    public void CreateShipment(IEnumerable<Shipment> shipments) 
    { 
     // Clients.All.createShipment(shipments.OrderByDescending(s => s.CreatedDate)); 
     Clients.Group(shipments.FirstOrDefault().ShipmentId) 
       .createShipment(shipments.OrderByDescending(s => s.CreatedDate)); 
    } 

    public async Task WatchShipmentId(string shipmentId) 
    { 
     await Groups.Add(Context.ConnectionId, shipmentId); 
     Clients.Group(shipmentId).createShipment(shipmentLogic.Get(shipmentId, true)); 
    } 

    public Task StopWatchingShipmentId(string shipmentId) 
    { 
     return Groups.Remove(Context.ConnectionId, shipmentId); 
    } 
} 

Мой клиент, более или менее, выглядит следующим образом:

var shipmentHub = $.connection.shipmentHub; 
$.connection.hub.logging = true; 
$.connection.hub.start(); 

var shipmentId = "SHP-W-GE-100122"; 

if (previousShipmentId) { 
    shipmentHub.server.stopWatchingShipmentId(previousShipmentId); 
} 

if (shipmentId.length) { 
    previousShipmentId = shipmentId; 
    shipmentHub.server.watchShipmentId(shipmentId); 
} 

В клиентских журналах SignalR я вижу, что они называют:

SignalR: Invoking shipmenthub.WatchShipmentId

SignalR: Вызов shipmenthub.StopWatchingShipmentId

SignalR: Вызов shipmenthub.WatchShipmentId

И, кроме всего журналов, эти методы являются удара:

proxies['shipmentHub'].server = { 
    createShipment: function (shipments) { 
     return proxies['shipmentHub'].invoke.apply(proxies['shipmentHub'], $.merge(["CreateShipment"], $.makeArray(arguments))); 
    }, 

    stopWatchingShipmentId: function (shipmentId) { 
     return proxies['shipmentHub'].invoke.apply(proxies['shipmentHub'], $.merge(["StopWatchingShipmentId"], $.makeArray(arguments))); 
    }, 

    watchShipmentId: function (shipmentId) { 
     return proxies['shipmentHub'].invoke.apply(proxies['shipmentHub'], $.merge(["WatchShipmentId"], $.makeArray(arguments))); 
    } 
}; 

И, как последнее замечание, прежде чем я добавил методы Watch и StopWatching, все остальное работало (т. е. CreateShipment назвал бы Client.All.createShipment метод без проблем).

ответ

0

Проблема обусловлена ​​спараметрированной конструктора в ShipmentHub. По Dependency Injection in SignalR:

По умолчанию SignalR ожидает класс ступицы иметь конструктор без параметров. Однако вы можете легко зарегистрировать функцию для создания экземпляров хаба и использовать эту функцию для выполнения DI. Зарегистрируйте функцию, вызвав GlobalHost.DependencyResolver.Register.

Таким образом, вы должны изменить свой метод Startup.Configuration(IAppBuilder app) разрешить зависимость для вас:

GlobalHost 
    .DependencyResolver 
    .Register(
     typeof(ShipmentHub), 
      () => new ShipmentHub(new ShipmentLogic())); 
0

Вам нужно подождать, пока соединение с сервером будет установлено, прежде чем вы сможете начать вызов методов на сервере с клиента. hub.start() возвращает обещание, вот основной шаблон для того, чтобы что-то сделать, когда это обещание будет разрешено.

var shipmentHub = $.connection.shipmentHub; 
    $.connection.hub.logging = true; 
    $.connection.hub.start().done(talkToServer); 

    var talkToServer=function(){ 
    var shipmentId = "SHP-W-GE-100122"; 
     if (previousShipmentId) { 
      shipmentHub.server.stopWatchingShipmentId(previousShipmentId); 
     } 

     if (shipmentId.length) { 
      previousShipmentId = shipmentId; 
      shipmentHub.server.watchShipmentId(shipmentId); 
     } 
} 
+0

же вопрос. Это в событии eventListener для события размытия ввода. Я перевел регистрацию этого 'eventListener' на обещание' done' и по-прежнему не могу использовать методы на сервере. То есть '$ .connection.hub.start(). Done (function() {theInput.addEventListener ('blur', function (evt) {// do stuff})});' – Tom

Смежные вопросы