Я новичок в SignalR, хотя у меня был большой опыт в течение недели. Насколько я понимаю, до запуска концентратора, клиентские методы должны быть зарегистрированы. В противном случае клиентские методы, такие как «onConnected» или «onDisconnected», не будут запущены, что является проблемой, с которой я столкнулся сейчас. Я работаю над написанием приложения для чата. Я могу подключиться к хабу и отправлять текстовые сообщения, а другие пользователи в комнате могут получать сообщения. Однако клиентские методы не вызываются. Хотя я думаю, что я зарегистрирую их до начала концентратора, но методы onConnected и другие клиенты не запускаются. Вот код:как убедиться, что методы клиентов зарегистрированы до запуска концентратора (SignalR 1.0)
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();
}
иметь вас Пробовал вызывать 'registerClientMethods' перед' connection.hub.start'? –
Я пробовал это, но это не помогло. Клиентские методы не вызываются. Раньше он работал, прежде чем я начал использовать ChatRooms. – renakre