Asp.Netcoreのwebsocket


Websocketはhtml 5の後の産物であり、aspに対して.Netcoreでもサポートされており、まずNuGetにMicrosoftを追加する.AspNetCore.WebSocketsの引用(現在は1.0.1バージョン、2017年3月7日発売).
まずConfigureにミドルウェアを追加
//  websocket   
app.UseWebSockets();

次に、Websocketを自分で処理するミドルウェアを定義します.コードは次のとおりです.
using Microsoft.AspNetCore.Http;
using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
 
namespace Asp.NetCore_WebPage.Middleware
{
    /// 
    /// websocket   ,               ,                
    /// 
    public class WebSocketNotifyMiddleware
    {
        /// 
        ///       
        /// 
        private readonly RequestDelegate _next;
        /// 
        /// 
        /// 
        /// 
        public WebSocketNotifyMiddleware(RequestDelegate next)
        {
            _next = next;
        }
        /// 
        ///      
        /// 
        /// 
        /// 
        public Task Invoke(HttpContext context)
        {
            //     websocket  
            if (context.WebSockets.IsWebSocketRequest)
            {
                //     
                var webSocket = context.WebSockets.AcceptWebSocketAsync().Result;
                //               
                new Thread(Accept).Start(webSocket);
                while (webSocket.State == WebSocketState.Open)
                {
                    webSocket.SendAsync(new ArraySegment(System.Text.Encoding.UTF8.GetBytes($"{DateTime.Now}")), System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None);
                    Thread.Sleep(1000);
                }
            }
            return this._next(context);
 
        }
        /// 
        ///          ,                 
        /// 
        /// 
        void Accept(object obj)
        {
            var webSocket = obj as WebSocket;
            while (true)
            {
                var acceptArr = new byte[1024];
 
                var result = webSocket.ReceiveAsync(new ArraySegment(acceptArr), CancellationToken.None).Result;
 
                var acceptStr = System.Text.Encoding.UTF8.GetString(acceptArr).Trim(char.MinValue);
                Console.WriteLine("    :" + acceptStr);
            }
 
        }
    }
}

ミドルウェア拡張の追加
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
 
namespace Asp.NetCore_WebPage.Middleware
{
    /// 
    /// websocket       
    /// 
    public static class WebSocketNotifyMiddlewareExtensions
    {
        /// 
        ///   websocket  
        /// 
        /// 
        /// 
        public static IApplicationBuilder UseWebSocketNotify(
          this IApplicationBuilder builder)
        {
            return builder.UseMiddleware();
        }
    }
}

これでStartupでcsのConfigureには、以下のコードで作成したミドルウェアが追加されています.
//  websocket   
 app.UseWebSockets();
 app.UseWebSocketNotify();

このサービス・エンドの作成が完了しました.次に、クライアントを参照してください.      :     
              
@section scripts{ var socket;      var uri = "ws://localhost:5000/ws"; // function doConnect(open, accept, close, error) { console.log("doConnect") // websocket,     socket = new WebSocket(uri);     socket.onopen = function (e) { open();};     socket.onclose = function (e) { close(); };     socket.onmessage = function (e) {         accept(e.data);     };     socket.onerror = function (e) { error(e.data); }; } // function doSend(message) {     console.log("doSend")     socket.send(message); } // socket function doClose() {     console.log("doClose")     socket.close(); }         //         function open() {             console.log("open")             document.getElementById("message").innerText = " ";         }         //         function accept(result) {             console.log("accept")             document.getElementById("output").innerText=result;         }         //         function close() {             console.log("close")             document.getElementById("message").innerText=" ";         }//         function error(result) {             console.log("error")             alert(" :"+result);         }         //         function start() {             console.log("start")             doConnect(open, accept, close, error);                  }         function send()         {             console.log("send")             doSend(document.getElementById("sendtxt").value);          }      }

ここでは基本的な例にすぎず、自分のビジネスに応じて異なる機能を実現することができます.