Получить имена онлайн-пользователей, подключенных к серверу

Я новичок в 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);
    }
}

Вы можете найти мой полный код здесь

РЕДАКТИРОВАТЬ: Пожалуйста, предоставьте простой пример, относящийся только к asp.net или signalr (без других технологий, таких как MVC)

Пожалуйста помоги.


person Mr_Green    schedule 03.12.2012    source источник


Ответы (3)


Изменить: следующий код относится к SignalR v0.5, а не к последней версии 1.0Alpha2, но я считаю, что аргументация такая же.

Для этого вам нужно добавить несколько шагов в процесс подключения SignalR как на сервере, так и на клиенте:

на стороне сервера:

  1. при запуске приложения, например, вы можете создать статический репозиторий в памяти (может быть словарем ), который будет служить репозиторием пользователей для хранения всех подключенных в настоящее время пользователей.
  2. В хабе вам нужно обработать событие Disconnect (когда пользователь отключается, его также необходимо удалить из пользовательского репозитория) и уведомить всех других клиентов, что этот пользователь отключился
  3. In the hub you need to add two new methods (the names can be whatever you want) that will help client connect to the system and get the list of currently connected users:
    1. GetConnectedUsers() that just returns a collection of connected users
    2. Joined(), где концентратор создаст нового пользователя, используя информацию, хранящуюся в состоянии приема-передачи (имя пользователя, выбранное клиентом), и идентификатор подключения 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()», то это потому, что в методе концентратора, обрабатывающем событие подключения, состояние приема-передачи еще недоступно, поэтому концентратор не может получить имя пользователя, выбранное пользователем.

Во всяком случае, я сделал сообщение в блоге, чтобы более подробно показать, как создать базовое веб-приложение чата SignalR с использованием Asp.Net MVC, и оно доступно по адресу: http://thewayofcode.wordpress.com/2012/07./24/chatr-just-another-chat-application-using-signalr/

В посте вы также найдете ссылку на репозиторий github, где опубликован исходный код. Надеюсь, это поможет.

Валерио

person s0nica    schedule 03.12.2012
comment
Я новичок в asp.net. Не могли бы вы объяснить это ясно? Я прошел по предоставленной вами ссылке. Но ссылка следует за концепцией MVC, которую мне не разрешено использовать в качестве стажера. - person Mr_Green; 05.12.2012
comment
Здравствуйте, я тоже ответил в своем блоге. Все, что вам нужно понять, это то, что в вашем коде javascript вам нужно создать объект, который связан с вашим концентратором на стороне сервера (через строку кода $.connection.chat), затем вам нужно назначить состояние туда и обратно этому объекту ( например, имя пользователя), реализовать все обратные вызовы, которые концентратор сможет вызывать с сервера, и, наконец, подключиться к серверу с помощью показанного выше блока кода ($.connection.hub.start(). Выполнено(....)...); На сервере ваш хаб будет реализовывать getConnectedUsers и Joined(), вот и все! - person s0nica; 05.12.2012
comment
К сожалению, я не знаю, что вы оба одинаковы :) .. В любом случае, я не могу перейти по ссылке, потому что она основана на MVC, с которым мне не разрешено работать. Я коснусь приведенного выше комментария и попытаюсь решить его. Спасибо за ответ. - person Mr_Green; 05.12.2012
comment
Как я уже сказал, вам не нужны материалы MVC в этой ссылке. В основном вам нужно взглянуть на методы getConnectedUsers и Joined, реализованные в Hub, и на часть кода javascript. Остальное зависит от тебя :) - person s0nica; 05.12.2012
comment
Дайте мне знать, если у вас есть более конкретные вопросы об этом. - person s0nica; 05.12.2012
comment
да, конечно .. в настоящее время у меня больше сомнений, которые, я думаю, я могу развеять, изучив основы .. : D - person Mr_Green; 05.12.2012
comment
К сожалению, да. Я сильно изменил его. Теперь я получаю две ошибки (строка: 47 и строка: 55) в файле jquery.. Please check here. Я упомянул две ошибки в середине кода в качестве комментариев. а вот Chat class file(для справки, если нужно) - person Mr_Green; 07.12.2012
comment
chat.server.GetConnectedUsers(): вам нужно использовать строчные буквы, поэтому chat.server.getConnectedUsers() (см. мой пример выше). Другая ошибка связана с тем, что слишком много и неправильно }); }); (опять же, см. мой пример выше) - person s0nica; 07.12.2012

Судя по всему, вы используете 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());
    }
}

Глобальное хранилище на стороне сервера (например, статический словарь) может использоваться для хранения состояния по идентификатору соединения — таким образом, этот словарь может предоставить вам пользователей для необходимых идентификаторов соединения. Например,

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

}
person VinayC    schedule 03.12.2012
comment
+1 Эй, я понимаю, что вы пытаетесь сказать .. Это сохранит значения на стороне сервера .. как тогда отображать их на клиентских страницах? - person Mr_Green; 03.12.2012
comment
VS показывает красные каракули на User Error --› The type or namespace name 'User' could not be found - person Mr_Green; 03.12.2012
comment
@Mr_Green, User будет настраиваемым классом - создайте в соответствии с вашими потребностями! - person VinayC; 03.12.2012
comment
@Mr_Green, в другом примечании, см. пример приложения для чата с использованием Signal-R - IMO, это может помочь во многих отношениях: thewayofcode.wordpress.com/2012/07/24/ - person VinayC; 03.12.2012
comment
Не могли бы вы привести пример того, каким должен быть класс User. Я прошел по ссылке.. Но, поскольку я новичок, я не могу этого понять. - person Mr_Green; 04.12.2012
comment
Как стажеру мне не разрешено использовать архитектуру MVC (ссылка соответствует шаблону MVC). Пожалуйста объясните понятно.. - person Mr_Green; 05.12.2012

Я думаю, это должно сработать для вас: -

   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 вернет вам все имена пользователей, которые находятся в сети: -

person Pranav    schedule 03.12.2012
comment
Никакого эффекта на страницу. Кажется, в вашем коде две проблемы.. 1) list был заполнен, но нигде не показан. 2) chatUsername переменная js file, в которой хранятся имена пользователей, в вашем коде не упоминается. (может ошибаюсь..) - person Mr_Green; 03.12.2012
comment
1) я только что показал вам, как действовать, а не полный код 2) я не знаю, как вы передаете переменную JS на сервер. 3) как вы планировали показать имя пользователя (в виде структуры таблицы, строки, разделенной запятыми или любая другая схема)??? - person Pranav; 03.12.2012