我是SignalR的初学者,虽然我在一周内有很多经验。据我所知,在Hub启动之前,应该注册客户端方法。否则,将不会触发客户端方法,如“onConnected”或“onDisconnected”,这是我现在遇到的问题。我正在写一个聊天应用程序。我能够连接到集线器并发送短信,房间中的其他用户都能够接收消息。但是,不调用客户端方法。虽然我认为我在Hub启动之前注册了它们,但是onConnected和其他客户端方法都没有被触发。这是代码:
Chat.aspx文件:
$(function () {
// Declare a proxy to reference the hub.
var chatHub = $.connection.chatHub;
registerClientMethods(chatHub); // <-this is where I register client methods
$.connection.hub.start(function () {
var roomName = $('#hdn_Roomid').val();
var userName = $('#hdn_NameSurname').val();
$('#hdSelectedRoom').val(roomName);
chatHub.server.joinRoom(roomName, userName);
});
// Start Hub
$.connection.hub.start().done(function () {
//this sets up the groupchat window, and load students
registerEvents(chatHub);
var name = $('#hdn_NameSurname').val();
chatHub.server.connect(name);
var a = 0;
});
});
function registerEvents(chatHub) {
$('#btn_SendGroupChat').live("click", function () {
var msg = $("#txt_InputGroupChat").val();
if (msg.length > 0) {
var userName = $('#hdn_NameSurname').val();
var roomname = $('#hdSelectedRoom').val();
chatHub.server.send(msg, roomname, userName);
..............
}
});
}
function registerClientMethods(chatHub) { // <-- These methods are never fired
// Calls when user successfully logged in
chatHub.client.onConnected = function (id, userName, allUsers, messages) {
......
}
// On New User Connected
chatHub.client.onNewUserConnected = function (id, name) {
//AddUser(chatHub, id, name);
}
// On User Disconnected
chatHub.client.onUserDisconnected = function (id, userName) {
//var userName = $('#hdn_NameSurname').val();
var roomname = $('#hdSelectedRoom').val();
chatHub.server.leaveRoom(roomname, userName);
.............
}
chatHub.client.messageReceived = function (userName, message) {
AddMessage(userName, message);
}
}
ChatHub.cs文件:
public void Connect(string userName)
{
var id = Context.ConnectionId;
if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)
{
ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserName = userName });
// send to caller
Clients.Caller.onConnected(id, userName, ConnectedUsers, CurrentMessage);
// send to all except caller client
Clients.AllExcept(id).onNewUserConnected(id, userName);
}
}
public void Send(string msg, string room, string userName)
{
Clients.Group(room).addMessage(msg, room);
Clients.Group(room).messageReceived(userName, msg);
}
public void JoinRoom(string roomName, string userName)
{
Groups.Add(Context.ConnectionId, roomName);
string msg = "<div class='text-muted'>" + userName + " joined the chat.</div>";
Clients.Group(roomName).addMessage(msg, roomName);
Clients.Group(roomName).messageReceived(userName, msg);
}
public void LeaveRoom(string roomName, string userName)
{
Groups.Remove(Context.ConnectionId, roomName);
string msg = "<div class='text-muted'>" + userName + " quit the chat.</div>";
Clients.Group(roomName).addMessage(msg, roomName);
Clients.Group(roomName).messageReceived(userName, msg);
}
public override System.Threading.Tasks.Task OnDisconnected()
{
var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
ConnectedUsers.Remove(item);
var id = Context.ConnectionId;
Clients.All.onUserDisconnected(id, item.UserName);
}
return base.OnDisconnected();
}
答案 0 :(得分:1)
您应该能够在调用start之前注册所有客户端事件。
我工作聊天的例子
// Chat
var chat = $.connection.chatHub;
chat.client.broadcastMessage = function (chatdata) {
var encodedName = htmlEncode(chatdata.Sender);
var encodedMsg = htmlEncode(chatdata.Message);
var msgClass = 'chatmessage'
// if the message is for this user highlight
if (encodedMsg.indexOf("@@" + $('#displayname').val()) > -1) {
msgClass = 'chatusermessage'
}
$('#discussion').append(String.format('<tr><td class="{0}"><strong onclick="populatechatname(\'{1}\');">{1}: </strong>{2}</td></tr>', msgClass, encodedName, emotify(encodedMsg)));
$('#chat').scrollTop($('#chat')[0].scrollHeight);
$('#chatcount').html('Users Online: ' + chatdata.OnlineCount);
};
// Start the connection.
$.connection.hub.start().done(function () {
chat.server.getMessages()
$('#sendmessage').click(function () {
// Call the Send method on the hub.
chat.server.send($('#displayname').val(), $('#message').val());
$('#message').val('').focus();
});
$('.message').keydown(function (event) {
if (event.keyCode == 13) {
chat.server.send($('#displayname').val(), $('#message').val());
$('#message').val('').focus();
return false;
}
});
});
答案 1 :(得分:1)
请注意,在SignalR的新AspNetCore版本(不再使用jquery的版本)中,这不再是问题。这是一个完全不同的API,因此,如果您已经使用了几年,则不仅是替代品的减少。
我以为我会在某个地方读到它,但是只是通过一个setTimeout
调用进行了验证,该调用注册了一个事件处理程序,并且消息在事发后进入。
在感到非常痛苦之前,这种痛苦被改变了。
答案 2 :(得分:0)
实际上,El Bruno alreaad提供了一个解决方案:http://elbruno.com/2014/07/25/signalr-error-html-client-does-not-raise-onconnected-method-on-server-hub-2/
以下是有类似问题的人的工作代码:
var chatHub;
$(window).ready(function () {
//$(function () {
// Declare a proxy to reference the hub.
var chatHub = $.connection.chatHub;
registerClientMethods(chatHub);
chatHub.client.foo = function () { }; // **This line solved the issue
// Start Hub
$.connection.hub.start().done(function () {
var roomName = $('#hdn_Roomid').val();
var userName = $('#hdn_NameSurname').val();
$('#hdSelectedRoom').val(roomName);
chatHub.server.joinRoom(roomName, userName);
//this sets up the groupchat window, and load students
registerEvents(chatHub);
var name = $('#hdn_NameSurname').val();
chatHub.server.connect(name);
var a = 0;
});
});