Я создаю веб-приложение, используя 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, и я получаю от этого регистратора:
Так что я знаю, someoneGotANewCar() был вызван , Тем не менее, я буду ожидать, что предупреждение («Emit») в моей службе произойдет в другом браузере, но этого не произойдет. Может кто-нибудь помочь мне узнать почему?
Если вам нужно больше кода, чтобы помочь найти решение просто спросить, и я буду редактировать его.
Huh. Ну, тогда asp.net солгал мне. В моей второй ссылке указано, что вам разрешено делать proxy.on() после вызова метода start ["Определить метод на клиенте (без сгенерированного прокси или при добавлении после вызова метода запуска)"] – Scott
Это работает , btw – Scott
@Scott Вы можете использовать porxy.on() после вызова метода start. Если вы посмотрите на «примечание» в разделе «Как установить соединение» в документах asp.net] (http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs- api-guide-javascript-client # установить соединение), он частично читает: «Если вы хотите зарегистрировать некоторые обработчики событий после установления соединения, вы можете это сделать, но вы должны зарегистрировать хотя бы один из ваших обработчиков событий до вызывая метод start ... вы не захотите запускать событие OnConnected на каждом концентраторе, если вы собираетесь использовать только один из них ». – halter73