Asp Net Core 2.1におけるSignalR運用

3861 ワード

前のプロジェクトの作成とSignalRの引用はマイクロソフトの公式文書にあります.私達は概説を行いません.今日は主にクライアントの接続と断線、単数対のメッセージを見ます.
まず登録と切断の過程で、JavaScriptから情報を送って、サーバーのConteextにこれらのデータを保存して、ユーザー名の状況によってDictoraryに保存します.
//JavaScript             
var connection;
$(function () {
    var userName"***";
    //         
    connection = new signalR.HubConnectionBuilder().withUrl("/chatHub?userName="+ userName        ).build();
    //        
    connection.on("ReceiveMessage", function (result) {alert(result); });
    //  SignalR     
    connection.start().catch(function(err){alert(err.toString());}).then(function () {});   
    });           
 public class ChatHub : Hub
 {   
    //    ID  
    private static Dictionary_connections=new Dictionary();     
    //     
    public override Task OnConnectedAsync()
    {
        string userName = Context.GetHttpContext().Request.Query["userName"];
        string pwd = Context.GetHttpContext().Request.Query["pwd"];
        if (_connections.ContainsKey(userName)) { 
             if (UserInfo.userPwd.ContainsKey(userName))
                {
                    Clients.Caller.SendAsync("ReceiveMessage", "    !");
                    //     (    Add    ,       )
                    SendLogin(userName, comip);
                }
                else
                {
                    Clients.Caller.SendAsync("ReceiveMessage", "      !");
                    //     (    Add    ,       )
                    SendLogin(userName, comip);
                }
            }
            return base.OnConnectedAsync();
        }
        //                 Id
         public void SendLogin(string username)
        {
            //          (          Id,         Id)
            if (!_connections.ContainsKey(username))
            {
                _connections(username, Context.ConnectionId);
            }
            else
            {
                 _connections[username]= Context.ConnectionId;
            }
        }
        //     
        public override Task OnDisconnectedAsync(Exception exception)
        {
            //        ,         
            var a = Context.ConnectionId;//   Id
            List dik = valeToKey(_connections, a);//  Id       
            if (dik.Count == 1)
            {
                _connections.Remove(dik[0]);//          
            }
            return base.OnDisconnectedAsync(exception);
        }
        //  value  key
        public List valeToKey(Dictionarydkv,string vle)
        {
            List resultKey = new List();
            foreach (var key in dkv.Keys)
            {
                if (dkv[key] == vle)
                {
                    resultKey.Add(key);
                }
            }
            return resultKey;
        }
}
メッセージの送信には様々な種類がありますが、グループ送信(Clients()-転送はすべて送信するクライアントId)、単発(Client)-参は送信するId)、およびすべての送信(All)が使用できます.
/**          
 **      
 **  SendByNumber  
 */
var user="********";//     
var information="xxxxxxxx";//      
connection.invoke("SendByNumber", user, information).catch(function (err) {
    return console.error(err.toString());
});
/**              **/
connection.on("Seddgfsx", function (fhx) {
    alert(fhx);
});
   public async Task SendByNumber(string user,string information)
   {
       string userId = sctConnections(user);
       await Clients.Client(_connections[user]).SendAsync("Seddgfsx", information);
    }
メッセージを送る原理は実はとても簡単で、JavaScript方法でサーバの方法を呼び出して、サーバーがuserを通じて(通って)Idであることを発見して、更にこのIdを使ってこのクライアントを呼び出す方法でメッセージを彼に伝えます.
皆さんの読書に感謝しています.また、収穫を期待しています.貴重な意見やアドバイスをしてくれて、より多くの人が技術という道を広く歩まれます.