Вземете имена на онлайн потребители, свързани към сървър

Нов съм в 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(), където Hub ще създаде нов потребител, използвайки информацията, съхранена в състоянието на двупосочна обработка (потребителското име, избрано от клиента) и ID на връзката 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 ред от код), след което трябва да присвоите състояние на двупосочно пътуване на този обект ( потребителското име на потребителя, например), внедрите всички обратни извиквания, които Hub ще може да извика от сървъра, и накрая се свържете със сървъра чрез блока от код, показан по-горе ($.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-script . Използвайте 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 Грешка --› The type or namespace name 'User' could not be found - person Mr_Green; 03.12.2012
comment
@Mr_Green, потребителят ще бъде персонализиран клас - създайте според вашите нужди! - 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 .......
     }

списъкът ще ви върне всички потребителски имена, които са онлайн: -

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