本文介绍 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 中间件:

  1. app.UseWebSockets();

可配置以下设置:

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

接受 WebSocket 请求

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

  1. app.Use(async (context, next) =>
  2. {
  3. if (context.Request.Path == "/ws")
  4. {
  5. if (context.WebSockets.IsWebSocketRequest)
  6. {
  7. WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
  8. await Echo(context, webSocket);
  9. }
  10. else
  11. {
  12. context.Response.StatusCode = ;
  13. }
  14. }
  15. else
  16. {
  17. await next();
  18. }
  19.  
  20. });

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

发送和接收消息

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

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

如果在开始循环之前接受 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 和应用。

  1. <system.webServer>
  2. <webSocket enabled="false" />
  3. </system.webServer>

原文链接

ASP.NET Core 中的 WebSocket 支持(转自MSDN)的更多相关文章

  1. 网络游戏开发-服务器(01)Asp.Net Core中的websocket,并封装一个简单的中间件

    先拉开MSDN的文档,大致读一遍 (https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/websockets) WebSocket 是一 ...

  2. 理解ASP.NET Core 中的WebSocket

    在本文中,我们将详细介绍RFC 6455 WebSocket规范,并配置一个通用的.NET 5应用程序通过WebSocket连接与SignalR通信. 我们将深入底层的概念,以理解底层发生了什么. 关 ...

  3. 在Asp.net Core中使用中间件来管理websocket

    介绍 ASP.NET Core SignalR是一个有用的库,可以简化Web应用程序中实时通信的管理.但是,我宁愿使用WebSockets,因为我想要更灵活,并且与任何WebSocket客户端兼容. ...

  4. 在Asp.net core中使用WebScocket

    今天小试了一下在Asp.net core中使用websocket,这里记录一下: 在 Startup 类的 Configure 方法中添加 WebSocket 中间件. app.UseWebSocke ...

  5. 在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持

    HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable ...

  6. 在ASP.NET Core中如何支持每个租户数据存储策略的数据库

    在ASP.NET Core中如何支持每个租户数据存储策略的数据库 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: ht ...

  7. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  8. [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢?

    [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢? 在ASP.NET Core应用程序中,接 ...

  9. ASP.NET Core 中文文档 第三章 原理(16).NET开放Web接口(OWIN)

    原文:Open Web Interface for .NET (OWIN) 作者:Steve Smith. Rick Anderson 翻译:谢炀(kiler398) 校对:孟帅洋(书缘) ASP.N ...

随机推荐

  1. 给大家分享下坐标转换的代码的JS和Python两个版本的源码【转】

    /** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ /** * 百度 ...

  2. MPU/SoC/Application Processor/Embedded OS

    Everything has its principles and mechanisms which are designed by its creator and followed by its u ...

  3. PGIS大数据量点位显示方案

    PGIS大数据量点位显示方案 问题描述 PGIS在地图上显示点位信息时,随点位数量的增加浏览器响应速度会逐渐变慢,当同时显示上千个点时浏览器会变得非常缓慢,以下是进行的测试: 测试环境: 服务器: C ...

  4. IOS xcode安装

    xcode软件下载地址: 可以通过虚拟机共享文件夹将xcode传递给虚拟机上的os系统: 第一个程序创建:

  5. MessageFormat使用记录

    1.日志里面需要记录入参,之前一般使用StringUtils.formt()方法,但是如果入参含有空值,就会报错.这个时候可以使用MessageFormat方法.用法 format(String pa ...

  6. 动态切换tableView中的cell的种类

    动态切换tableView中的cell的种类 为什么要动态切换tableView中cell的种类呢?如果项目经理不出这种需求,你也就见不到这篇文章了:) 效果: 源码: 首先,你要准备3种cell,直 ...

  7. 沉淀再出发:jetty的架构和本质

    沉淀再出发:jetty的架构和本质 一.前言 我们在使用Tomcat的时候,总是会想到jetty,这两者的合理选用是和我们项目的类型和大小息息相关的,Tomcat属于比较重量级的容器,通过很多的容器层 ...

  8. LNMP-day2-进阶

    部署LNMP环境 http://www.cnblogs.com/wazy/p/8386493.html 安装部署wordpress #下载wordpress [root@locahost downlo ...

  9. August 20th 2017 Week 34th Sunday

    Life is not a race, but a journey to be savored each step of the way. 生活不是一场赛跑,而是每一步都应该细细品尝的人生旅程. No ...

  10. [BZOJ 2730][HNOI 2012] 矿场搭建

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2113  Solved: 979[Submit][Statu ...