asp.Netmvcはapiによりwebsocket通信を実現する

8568 ワード

この例に従ってwebsocket通信を実装する場合は、iisが8.0バージョン以上であることを確認する必要があります.低バージョンではこの実装はサポートされていないようです.
APIコントローラMessageSendControllerを作成します.コントローラの下でGETメソッドを作成してwebsocketの初期化を実現し、フロントエンドアクセス時発がwebsockcetアクセスif(HttpContext.Current.IsWebSocketRequest)であると判断し、HttpContextを初期化する.Current.AcceptWebSocketRequest(Websockets); Websocketsメソッドを作成して、メッセージの受信と送信を実現します.具体的なコードは、次のです.
public static List.socketMod> Listws = new List();
private async Task Websockets(AspNetWebSocketContext arg) 
{
    var web = arg.WebSocket;
    while (true) 
    {
        //ArraySegment      ,                
        ArraySegment buffer = new ArraySegment(new byte[1024]);
        //    
        WebSocketReceiveResult result = await web.ReceiveAsync(buffer, CancellationToken.None);
        //            
        if (web.State == WebSocketState.Open) 
        {
            string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
            //         ,                          ,     
            if(message.Contains("  ")) 
            {
                var id = message.Split('|').LastOrDefault()?.ObjTolong();
                var mesd = Listws.FirstOrDefault(p => p.userid == id);
                mesd.isstop = true;
            }
            //            ,      ,  socketMod          ,             ,                  id           ,               ,         CallContext(     ) ,            。
            if (message.ObjTolong() > 0&&!Listws.Exists(p=>p.userid==message.ObjTolong())) 
            {
                var md=new Models.socketMod();
                md.SecWebSocketKey = arg.SecWebSocketKey;
                md.userid = message.ObjTolong();
                md.webst = web;
                Listws.Add(md);
            }
            var mes = new BLL.mescontent();
            mes.jdt = "0";
            mes.mess = "     :"  + DateTime.Now.ToLongTimeString();
            buffer = new ArraySegment(Encoding.UTF8.GetBytes(mes.MToString()));
            //       ,        Listws             
            await web.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
        } else 
        {
            if (Listws.Exists(p=>p.SecWebSocketKey==arg.SecWebSocketKey)) 
            {
                Listws.Remove(Listws.FirstOrDefault(p=>p.SecWebSocketKey.Equals(arg.SecWebSocketKey)));
                SessionHelper.SetCach("websockect", Listws);
            }
            break;
        }
    }
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 4、フロントエンドコードの
 var ws;
    var $msg = $("#msged");
    var $jdt = $("#jindut");
    $(function() {
        connec();
    });
    function connec()
    {
    //   websocket  
        ws = new WebSocket("ws://" + window.location.hostname + ":" + window.location.port + "/api/MessageSend");
        ws.onopen = function () {
            $msg.html("       ");
            send();
        }
        ws.onmessage = function (msg) {

            var md = $.parseJSON(msg.data);
            $msg.html(md.mess);           
            $jdt.css("width", md.jdt + "%");
            $jdt.attr("aria-valuenow", md.jdt);


        }
        ws.onerror = function (err) {
            $msg.html(err);
        }
        ws.onclose = function () {
            $msg.html("      ");
        }
    }
    //       
    function send() {
        // alert(ws.readyState);
        if (ws.readyState === WebSocket.OPEN) {
            ws.send('@SessionHelper.GetSession(MeSession.UserManageID)');
        } else {
            $msg.html("      ");
        }
    }