2

私はasp.netが初めてです。linkasp.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のような他のテクノロジーはありません)

助けてください。

4

3 に答える 3

2

編集:次のコードは、最新の1.0Alpha2ではなくSignalR v0.5を参照していますが、理由は同じだと思います

これを行うには、サーバーとクライアントの両方で、SignalR接続プロセスにいくつかの手順を追加する必要があります。

サーバー側:

  1. たとえば、アプリケーションの起動時に、現在接続されているすべてのユーザーを格納するためのユーザーリポジトリとして機能する静的なメモリ内リポジトリ(の辞書にすることができます)をインスタンス化できます。
  2. ハブでは、Disconnectイベントを処理し(ユーザーが切断した場合、ユーザーリポジトリからも削除する必要があります)、このユーザーが切断したことを他のすべてのクライアントに通知する必要があります
  3. ハブでは、クライアントがシステムに接続し、現在接続されているユーザーのリストを取得するのに役立つ2つの新しいメソッド(名前は任意の名前にすることができます)を追加する必要があります。
    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()」のようなステージを追加する必要がある理由を尋ねる場合、接続イベントを処理しているハブのメソッドでは、ラウンドトリップ状態がまだ利用できないため、ハブはユーザーが選択したユーザー名。

とにかく、Asp.Net MVCを使用して基本的なSignalRチャットWebアプリケーションを作成する方法をより詳細に示すためにブログ投稿を作成しました。これは、http: //thewayofcode.wordpress.com/2012/07/24/chatr-で入手できます。 just-another-chat-application-using-signalr /

投稿には、ソースが公開されているgithubリポジトリへのリンクもあります。これがお役に立てば幸いです。

バレリオ

于 2012-12-03T12:17:54.460 に答える
2

どうやら、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());
    }
}

グローバル サーバー サイド ストア (静的辞書など) を使用して、接続 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 に答える
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 .......
     }

リストは、オンラインのすべてのユーザー名を返します:-

于 2012-12-03T07:02:23.890 に答える