我是asp.net的新手。我已经完成了这个link
,它已经展示了如何计算使用asp.net连接到服务器的在线用户。 (当我尝试时正在工作)
我的问题是:我应该在该代码中更改什么(Global.asax),以便它显示所连接用户的所有名称而不是计算它们。
我创建了一个聊天应用程序,它将已连接用户的名称存储在chatUsername
文件中的变量js
中,如下所示:
js文件
var chatUsername = window.prompt("Enter Username:", "");
//
chat.client.addMessage = //Function
//
chat.server.send(chatUsername);
.aspx.cs文件
//Using SignalR (I think this doesnt matter)
public class Chat : Hub
{
public void Send(string from)
{
// Call the addMessage method on all clients
Clients.All.addMessage(from);
}
}
您可以找到我的完整代码 here
编辑:请提供一个仅与asp.net
或signalr
相关的简单示例(没有其他技术,如MVC)
请帮忙。
答案 0 :(得分:2)
显然,您正在使用Signal-R - 因此请尝试在java脚本本身中跟踪在线用户(即已连接的客户端)的状态。使用Connected/Disconnected/Reconnected
服务器端事件向所有客户端广播 - 来自documentation:
public class Chat : Hub
{
public override Task OnConnected()
{
return Clients.All.joined(Context.ConnectionId, DateTime.Now.ToString());
}
public override Task OnDisconnected()
{
return Clients.All.leave(Context.ConnectionId, DateTime.Now.ToString());
}
public override Task OnReconnected()
{
return Clients.All.rejoined(Context.ConnectionId, DateTime.Now.ToString());
}
}
全局服务器端存储(例如 - 静态字典)可用于根据连接ID存储状态 - 这样,此字典可以为用户提供所需的连接ID。例如,
// dis-claimer: untested code - just to give the idea/hint/outline
public class Chat : Hub
{
// change to use Concurrent Dictionary (or do thread-safe access)
static Dictionary<string, User> _users = new Dictionary<string, User>()
// call from client when it goes online
public void Join(string name)
{
var connId = this.Context.ConnectionId;
__users.Add(connId, new User(connId, name));
}
public override Task OnConnected()
{
return Clients.All.joined(_users[Context.ConnectionId], DateTime.Now.ToString());
}
public override Task OnDisconnected()
{
var user = _users[Context.ConnectionId];
_users.Remove(Context.ConnectionId);
return Clients.All.leave(user, DateTime.Now.ToString());
}
public List<User> GetUsers()
{
return _users.Values.ToList()
}
}
答案 1 :(得分:2)
编辑:以下代码是指SignalR v0.5,而不是最新的1.0Alpha2,但我相信推理是一样的
为此,您需要在服务器和客户端中为SignalR连接过程添加几个步骤:
在服务器端:
在客户端: 首先,您需要实例化与服务器端集线器相关的javascript对象
var chat = $.connection.chat;
chat.username = chatUsername;
然后实现集线器将调用的所有函数,最后连接到集线器:
// Step 1: Start the connection
// Step 2: Get all currenlty connected users
// Step 3: Join to the chat and notify all the clients (me included) that there is a new user connected
$.connection.hub.start()
.done(function () {
chat.getConnectedUsers()
.done(/*display your contacts*/);
});
}).done(function () {
chat.joined();
});
});
});
如果你问为什么我们需要添加一个像“chat.joined()”这样的阶段是因为在处理连接事件的Hub上的方法中,往返状态还不可用,所以中心无法检索用户选择的用户名。
无论如何,我发了一篇博文,详细展示了如何使用Asp.Net MVC创建基本的SignalR聊天Web应用程序,它可以在以下位置获得: http://thewayofcode.wordpress.com/2012/07/24/chatr-just-another-chat-application-using-signalr/
在帖子中,您还将找到指向发布源的github存储库的链接。 我希望这会有所帮助。
瓦莱里奥
答案 2 :(得分:1)
我认为这应该适合你: -
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
Application["OnlineUsers"] = 0;
List<string> list = new List<string>();
}
//First check if it is Authenticated request:-
void Session_Start(object sender, EventArgs e)
{
if(Request.IsAuthenticated)
list.Add(User.Identity.Name);
//your rest of code .......
}
列表将返回所有在线用户名: -