zoukankan      html  css  js  c++  java
  • ASP.NET Core 中的 WebSocket 支持(转自MSDN)

    本文介绍 ASP.NET Core 中 WebSocket 的入门方法。 WebSocket (RFC 6455) 是一个协议,支持通过 TCP 连接建立持久的双向信道。 它用于从快速实时通信中获益的应用,如聊天、仪表板和游戏应用。

    如果不明白什么是WebSocket可以参考这篇文章

    系统必备


    • ASP.NET Core 1.1 或更高版本
    • 支持 ASP.NET Core 的任何操作系统:
      • Windows 7/Windows Server 2008 或更高版本
      • Linux
      • macOS
    • 如果应用在安装了 IIS 的 Windows 上运行:
      • Windows 8 / Windows Server 2012 及更高版本
      • IIS 8 / IIS 8 Express
      • 必须在 IIS 中启用 WebSocket(请参阅 IIS/IIS Express 支持部分。)
    • 如果应用在 HTTP.sys 上运行:
      • Windows 8 / Windows Server 2012 及更高版本

    何时使用 WebSocket


     通过 WebSocket 可直接使用套接字连接。 例如,使用 WebSocket 可以让实时游戏达到最佳性能。

    ASP.NET Core SignalR 是一个库,可用于简化向应用添加实时 Web 功能。 它会尽可能地使用 WebSocket。

    如何使用 Websocket


    配置中间件

    Startup 类的 Configure 方法中添加 WebSocket 中间件:

    app.UseWebSockets();

    可配置以下设置:

    • KeepAliveInterval - 向客户端发送“ping”帧的频率,以确保代理保持连接处于打开状态。
    • ReceiveBufferSize - 用于接收数据的缓冲区的大小。 高级用户可能需要对其进行更改,以便根据数据大小调整性能。
    var webSocketOptions = new WebSocketOptions()
    {
        KeepAliveInterval = TimeSpan.FromSeconds(120),
        ReceiveBufferSize = 4 * 1024
    };
    app.UseWebSockets(webSocketOptions);

    接受 WebSocket 请求

    在请求生命周期后期(例如在 Configure 方法或 MVC 操作的后期,实际上下面的app.Use我觉得应该放在Configure 方法中的app.UseMvc之前,否则请求就被MVC的中间件先执行了),检查它是否是 WebSocket 请求并接受 WebSocket 请求。
    以下示例来自 Configure 方法的后期:

    app.Use(async (context, next) =>
    {
        if (context.Request.Path == "/ws")
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
                await Echo(context, webSocket);
            }
            else
            {
                context.Response.StatusCode = 400;
            }
        }
        else
        {
            await next();
        }
    
    });

    WebSocket 请求可以来自任何 URL,但此示例代码只接受 /ws 路径的请求。

    发送和接收消息

    AcceptWebSocketAsync 方法将 TCP 连接升级到 WebSocket 连接,并提供 WebSocket 对象。 使用 WebSocket 对象发送和接收消息。
    之前显示的接受 WebSocket 请求的代码将 WebSocket 对象传递给 Echo 方法。 代码接收消息并立即发回相同的消息。 循环发送和接收消息,直到客户端关闭连接:

    private async Task Echo(HttpContext context, WebSocket webSocket)
    {
        var buffer = new byte[1024 * 4];
        WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        while (!result.CloseStatus.HasValue)
        {
            //个人觉得实际上可以将下面的webSocket.SendAsync方法放到一个Task里面,来启动另一个线程然后在内部不断循环来处理发送数据的任务,避免和下面的webSocket.ReceiveAsync轮流执行,从而提高效率
            await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
    
            result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
        }
        await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
    }

    如果在开始循环之前接受 WebSocket 连接,中间件管道会结束。 关闭套接字后,管道展开。 即接受 WebSocket 时,请求停止在管道中推进。 循环结束且套接字关闭时,请求继续回到管道。

    IIS/IIS Express 支持


    安装了 IIS/IIS Express 8 或更高版本的 Windows Server 2012 或更高版本以及 Windows 8 或更高版本支持 WebSocket 协议。
    在 Windows Server 2012 或更高版本上启用对 WebSocket 协议的支持:

    1. 通过“管理”菜单或“服务器管理器”中的链接使用“添加角色和功能”向导。
    2. 选择“基于角色或基于功能的安装”。 选择“下一步”。
    3. 选择适当的服务器(默认情况下选择本地服务器)。 选择“下一步”。
    4. 在“角色”树中展开“Web 服务器 (IIS)”、然后依次展开“Web 服务器”和“应用程序开发”。
    5. 选择“WebSocket 协议”。 选择“下一步”。
    6. 如果无需其他功能,请选择“下一步”。
    7. 选择“安装” 。
    8. 安装完成后,选择“关闭”以退出向导。

    在 Windows 8 或更高版本上启用对 WebSocket 协议的支持:

    1. 导航到“控制面板” > “程序” > “程序和功能” > “打开或关闭 Windows 功能”(位于屏幕左侧)。
    2. 打开以下节点:“Internet Information Services” > “万维网服务” > “应用程序开发功能”。
    3. 选择“WebSocket 协议”功能。 选择“确定”。

    在 node.js 上使用 socket.io 时禁用 WebSocket
    如果在 Node.js 的 socket.io 中使用 WebSocket 支持,请使用 web.config 或 applicationHost.config 中的 webSocket 元素禁用默认的 IIS WebSocket 模块。如果不执行此步骤,IIS WebSocket 模块将尝试处理 WebSocket 通信而不是 Node.js 和应用。

    <system.webServer>
      <webSocket enabled="false" />
    </system.webServer>

    原文链接

  • 相关阅读:
    逆向实战干货,植物大战僵尸快速定位自动捡阳光Call,或者标志
    常见注入手法第二讲,APC注入
    Polipo
    Tinyproxy
    Varnish Cache
    jxls-1.x导出excel入门——基本操作
    【Hutool】Hutool工具类之日期时间工具——DateUtil
    SVN-Tips
    Java使用POI导出excel(下)——实例与小技巧
    Linux入门进阶第三天——软件安装管理(下)
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/9813918.html
Copyright © 2011-2022 走看看