2014-06-10 1 views
0

Я создаю веб-приложение, используя AngularJS и SignalR. Для этого, я основываясь на этом коде: http://sravi-kiran.blogspot.com/2013/09/ABetterWayOfUsingAspNetSignalRWithAngularJs.htmlМетод вызова метода SignalR не получен

Я также использовал http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-javascript-client#logging, чтобы убедиться, что мой код отформатирован правильно. Однако мой код работает некорректно.

Вот код:

Startup.cs

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapSignalR(); 
    } 
} 

CarHub.cs

public class CarHub : Hub 
{ 
    public void Send(string carType) 
    { 
     // Call the broadcastMessage method to update clients. 
     System.Diagnostics.Debug.WriteLine("Sending! - " + carType); 
     Clients.All.someoneGotANewCar(carType); 
    } 
} 

Угловая служба

homeCarspageModule.service('signalRSvc', ["$", "$rootScope", function ($, $rootScope) { 
    var proxy = null; 

    var initialize = function() 
    { 
     alert("Initialize!"); 
     //Getting the connection object 
     var connection = $.hubConnection(); 

     //Creating proxy 
     proxy = connection.createHubProxy('carHub'); 

     //Starting connection 
     connection.start(); 
     connection.logging = true; 


     //Publishing an event when server pushes a new car 
     proxy.on('someoneGotANewCar', function (carType) { 
      alert("Emit! - " + carType); 
      $rootScope.$emit("someoneGotANewCar", carType); 
     }); 

     alert("Initialization Complete!"); 
    }; 

    var sendRequest = function (carType) { 
     //Invoking send method defined in hub 
     alert("Invoking!"); 
     proxy.invoke('send', carType); 
    }; 

    return { 
     initialize: initialize, 
     sendRequest: sendRequest 
    }; 

}]); 

Угловая контроллер

var mainCarsController = ["$scope", "$http", "$location", "$routeParams", "dataService", "signalRSvc", "$rootScope", 
    function($scope, $http, $location, $routeParams, dataService, signalRSvc, $rootScope) { 

     $scope.person = null; 

     //Get car data from server 
     dataService.getPersonByIdIncludeCarsAndOwners($routeParams.personId) 
      .then(function(result) { 
       $scope.person = result; 
      }, function() { 
       alert("carsController (1) : Error connecting to server"); 
      }); 

     //SignalR 

     var updateOnNewCar = function (text) { 
      alert("Updating!"); 
      alert("SignalR received: " + text); 
     } 

     $rootScope.$on("someoneGotANewCar", function (e, carType) { 
      $scope.$apply(function() { 
       alert("Recieved!"); 
       updateOnNewCar(carType); 
      }); 
     }); 

     signalRSvc.initialize(); 

    }]; 

Мой код будет добраться до WriteLine в carhub.cs, и я получаю от этого регистратора: enter image description here

Так что я знаю, someoneGotANewCar() был вызван , Тем не менее, я буду ожидать, что предупреждение («Emit») в моей службе произойдет в другом браузере, но этого не произойдет. Может кто-нибудь помочь мне узнать почему?

Если вам нужно больше кода, чтобы помочь найти решение просто спросить, и я буду редактировать его.

ответ

3

Вы должны объявить прокси-функцию обратного вызова (proxy.on(...)) перед началом соединения (connection.start()).

+0

Huh. Ну, тогда asp.net солгал мне. В моей второй ссылке указано, что вам разрешено делать proxy.on() после вызова метода start ["Определить метод на клиенте (без сгенерированного прокси или при добавлении после вызова метода запуска)"] – Scott

+0

Это работает , btw – Scott

+2

@Scott Вы можете использовать porxy.on() после вызова метода start. Если вы посмотрите на «примечание» в разделе «Как установить соединение» в документах asp.net] (http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs- api-guide-javascript-client # установить соединение), он частично читает: «Если вы хотите зарегистрировать некоторые обработчики событий после установления соединения, вы можете это сделать, но вы должны зарегистрировать хотя бы один из ваших обработчиков событий до вызывая метод start ... вы не захотите запускать событие OnConnected на каждом концентраторе, если вы собираетесь использовать только один из них ». – halter73

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

  • Нет связанных вопросов^_^