使用角度路径后,SignalR无法正常工作

时间:2014-10-18 03:55:35

标签: c# angularjs asp.net-mvc signalr signalr-hub

问题是如果我第一次加载"#/ chat"我的信号R聊天工作完美。但如果我第一次加载"#/"然后路由到"#/ chat"我的聊天无效。

我是Signal R的新手,所以我实际上并不知道这个问题。 这是我的代码:

app.js

module.config(function ($routeProvider) {
        $routeProvider.when("/", {
            controller: "ItemsController",
            templateUrl: "/templates/itemsView.html"
        });


        $routeProvider.when("/item/:id", {
            controller: "SingleItemController",
            templateUrl: "/templates/singleItemView.html"
        });


        $routeProvider.when("/login", {
            controller: "LoginController",
            templateUrl: "/templates/loginView.html"
        });

        $routeProvider.when("/chat", {
            controller: "ChatController",
            templateUrl: "/templates/chatView.html"
        });

        $routeProvider.otherwise({ redirectTo: "/" });
    });

  $(function () {
       $.connection.hub.logging = true;  //for debugg
       $.connection.hub.start();
  });

   $.connection.hub.error(function (err) {
       console.log('An error occurred: ' + err);
   });

   angular.module('ogateApp').value("chat", $.connection.chat);

ChatHub.cs

  [HubName("chat")]
    public class ChatHub : Hub
    {   
        public void SendMessage(string message)
        {
            Clients.All.newMessage(message);
        }   

    }

ChatController.js

module.controller("ChatController", function ($scope, chat) {        

    $scope.messages = [];

    $scope.sendMessage = function() {

       chat.server.sendMessage($scope.newMessage);

        $scope.newMessage = "";
    };

    chat.client.newMessage = function (message) {
        $scope.messages.push({ message: message });
        $scope.$apply();
        console.log(message);
    };       

});

2 个答案:

答案 0 :(得分:2)

调试时发现集线器仍然附着在超出范围的陈旧控制器上。 SignalR没有重新启动您导航回我们页面时创建的控制器新实例的集线器。

为了解决此问题,如果您在更改路径时停止了集线器,则当您导航回初始页面时,集线器会再次正确启动。

以下代码修复了此问题:

app.run([
    '$rootScope', function ($rootScope, security) {

        $rootScope.$on('$routeChangeStart', function (event, currRoute, prevRoute) {
            $.connection.hub.stop();
        });
}]);

详情请参阅此LINK

答案 1 :(得分:0)

我认为您的相对js文件路径中存在错误。

<script src="Scripts/jquery-1.10.2.min.js"></script>
<script src="Scripts/jquery.signalR-2.1.0.min.js"></script>
<script src="signalr/hubs"></script>

尝试使用绝对网址进行测试:

<script src="http://localhost:your_port/signalr/hubs"></script>

在js调试期间你有异常吗?我能看到你的html页面(whith js reference)吗?