SignalR让Hub外的客户端无法正常工作

时间:2015-02-05 13:56:51

标签: javascript c# jquery asp.net signalr

我试图从控制器调用signalR,但它不起作用。

控制器

public ActionResult Index(){
   var hub = GlobalHost.ConnectionManager.GetHubContext<ClientControl>();
   hub.Clients.All.sendMessage("ahahhaaa");
   //... return and staff
}

集线器

[Authorize]
[HubName("userTracking")]
public class ClientControl : Hub
{

    public void RegisterConnection(String controller, String action)
    {

    }
    public override Task OnConnected()
    {

    }
    public override Task OnDisconnected()
    {

        return base.OnDisconnected();
    }

}

前端

$(document).ready(function () {
    var trackhub = $.connection.userTracking;
    trackhub.client.sendMessage = function (msg) {
        alert(msg);
    }
    $.connection.hub.logging = true;
    $.connection.hub.start();
});

在控制器中它不会引发错误。当我调试并暂停它时,hub对象存在,但是当我执行它时,它不会向前端发送任何消息。如果我从集线器调用相同的方法 - 作为魅力。 任何想法,问题的根本原因是什么?如果需要 - 在评论中写下我将提供更多信息。

2 个答案:

答案 0 :(得分:1)

服务器

public class ChatHub : Hub
{

        public int TryAddNewUser(string userName)
        {
            //some logic...
            Clients.All.AddUserToUserList(id, userName);
            return id;
        }

        public void AddNewMessageToPage(int id, string message)
        {
            //some logic...
            Clients.All.addNewMessageToPage(u.Login, message);
        }

}

客户端

$(document).ready(function () {
    //first need register client methods
    var chat = $.connection.chatHub;
    chat.client.addUserToUserList = function (id, login) {
        //client logic for add new user
    }

    chat.client.addNewMessageToPage = function (login, message) {
        //client logic for add new message from user
    }

    //second need start chat
    $.connection.hub.start().done(function () {
        chat.server.tryAddNewUser(login).done(function (id) {
            alert("Added " + id)
        });
    });

});

控制器

public class ChatController : Controller
{
   private IMyDataService _service;
   public ChatController(IMyDataService s)
   {
      _service = s;
   }

   public ActionResult Index()
   {
      return View(new MyDataViewModel(_service));
   }

}

注意,必须使用相同的路径添加动态js文件

<script type="text/javascript" src="~/signalr/hubs"></script>

我将以下代码添加到Startup.cs

using Owin;
using Microsoft.Owin;

    [assembly: OwinStartup(typeof(ChatRoom.Startup))]
    namespace ChatRoom
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                // Any connection or hub wire up and configuration should go here
                app.MapSignalR();
            }
        }
    }

关于这一点,请参阅link

答案 1 :(得分:0)

请将控制器中的集线器名称更改为

使用

var hub = GlobalHost.ConnectionManager.GetHubContext<UserTracking>();
       hub.Clients.All.sendMessage("ahahhaaa");

而不是

var hub = GlobalHost.ConnectionManager.GetHubContext<ClientControl>();
       hub.Clients.All.sendMessage("ahahhaaa");

请注意 GetHubContext&lt;&gt; 中Hub类名称的更改。

希望这有帮助。