2

我是 asp.net 的新手。我已经完成了这个link,它展示了如何计算使用 asp.net 连接到服务器的在线用户。(当我尝试时它正在工作

我的问题是:我应该在该代码(Global.asax)中进行什么更改,以便它显示所有连接用户的名称,而不是计算它们。

我创建了一个聊天应用程序,它将连接用户的名称存储chatUsernamejs文件中的一个变量中,如下所示:

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);
    }
}

你可以在这里找到我的完整代码

编辑:请提供一个仅与asp.net或相关的简单示例signalr(没有其他技术,如 MVC)

请帮忙。

4

3 回答 3

2

显然,您正在使用Signal-R - 所以尝试在 java 脚本本身中跟踪在线用户(即连接的客户端)的状态。使用Connected/Disconnected/Reconnected服务器端事件向所有客户端广播 - 来自文档

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()
    }

}
于 2012-12-03T07:51:29.850 回答
2

编辑:以下代码指的是 SignalR v0.5,不是最新的 1.0Alpha2,但我相信推理是一样的

为此,您需要在服务器和客户端中向 SignalR 连接过程中添加几个步骤:

在服务器端:

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

在客户端:首先您需要实例化与您的服务器端集线器相关的 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 上处理连接事件的方法中,往返状态尚不可用,因此 hub 无法检索到用户选择的用户名。

无论如何,我发表了一篇博文,更详细地展示了如何使用 Asp.Net MVC 创建一个基本的 SignalR 聊天 Web 应用程序,它可以在以下位置获得:http: //thewayofcode.wordpress.com/2012/07/24/chatr-只是另一个聊天应用程序使用信号/

在帖子中,您还将找到一个指向发布源代码的 github 存储库的链接。我希望这有帮助。

瓦莱里奥

于 2012-12-03T12:17:54.460 回答
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 .......
     }

list 将返回您所有在线的用户名:-

于 2012-12-03T07:02:23.890 回答