获取连接到服务器的在线用户的名称

时间:2012-12-03 06:52:50

标签: asp.net signalr global-asax

我是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.netsignalr相关的简单示例(没有其他技术,如MVC)

请帮忙。

3 个答案:

答案 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连接过程添加几个步骤:

在服务器端:

  1. 在应用程序启动时,例如,您可以实例化一个静态内存存储库(可以是一个字典),它将作为存储所有当前连接用户的用户存储库。
  2. 在集线器中,您需要处理Disconnect事件(当用户断开连接时,也需要从用户存储库中删除)并通知所有其他客户端此用户已断开连接
  3. 在集线器中,您需要添加两个新方法(名称可以是您想要的任何名称),这将有助于客户端连接到系统并获取当前连接的用户列表:
    1. 仅返回已连接用户集合的GetConnectedUsers()
    2. 加入(),Hub将创建一个新用户,使用往返状态(客户端选择的用户名)和SignalR连接ID存储的信息,并将新创建的用户添加到内存中库中。
  4. 在客户端: 首先,您需要实例化与服务器端集线器相关的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 .......
     }

列表将返回所有在线用户名: -