在我的聊天应用程序项目中,每当新用户连接到服务器时,我都会尝试向所有用户广播用户名。并在用户离开服务器时删除用户名。以下是我通过教程尝试的代码。 (请查看未显示所需输出的file.js
文件)
Chat.cs (工作) - >实现SignalR的“Hub”类
public class Chat : Hub
{
/* showing only related content */
static ConcurrentDictionary<string, User> _users = new ConcurrentDictionary<string, User>();
public override Task OnDisconnected()
{
var user = _users[Context.ConnectionId]; //user as ConnectionId
User removedUser; //new class object
_users.TryRemove(Context.ConnectionId, out removedUser);
return Clients.All.leave(user, DateTime.Now.ToString()); //dynamic expression
}
public void Joined()
{
User user = new User(Context.ConnectionId, Clients.Caller.username);
_users.TryAdd(user.ConnectionID, user);
Clients.All.joins(user.ConnectionID, user.Name, DateTime.Now); //dynamic expression
}
}
User.cs (工作)
public class User
{
public User(string ConnID, string Username)
{
Name = Username;
ConnectionID = ConnID;
}
public string Name { get; set; }
public string ConnectionID { get; set; }
}
file.js (无法正常工作)
var chatUsername = window.prompt("Enter Username:", ""); //username
var chat = $.connection.chat; //connection
//
chat.client.joins = function (ConnectionId, name, Date) {
ConnectionId = 1; /* given value to just test */
name = chatUsername;
};
chat.client.leave = function (user, date) {
user = ""; //making the string empty so that the disconnected user value will be lost.
};
//Here is the connection which calls the "Joined" function of the server (Chat.cs)
我应该在file.js
个函数中写一下( 加入 和 离开 )以便我将如上所述得到所需的结果。在问这里之前,我已经完成了 site ,它正在做同样的事情,但包括我不想包含的其他javascript文件(knockout.js和json)。(bcos我是新的到jquery)。
答案 0 :(得分:1)
为了将UserNames传递给客户端,您可以使用字典,并且在您的联合服务器端方法中,您可以将SignalR行更改为:
Clients.All.joins(_users.Values); //dynamic expression
然后客户端版本的连接将是:
chat.client.joins = function (users) {
for(var i = users.length - 1; i >= 0; i--) {
alert("User Name: " + users[i].Name + "\nUser Connection ID: " + users[i].ConnectionID);
}
};
当然,您可以以不同于提醒用户信息的方式处理用户信息,但这是如何处理数据的要点。最后,我建议不要将连接ID传递给每个人,因为第三方可以轻易地劫持它。