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>

原文链接

原文地址:https://www.cnblogs.com/OpenCoder/p/9813918.html

时间: 2024-10-17 18:41:47

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

Asp.net core中的websocket

Websocket是html5后的产物,对于asp.net core中也得到了支持,首先在NuGet中添加Microsoft.AspNetCore.WebSockets的引用(现在是1.0.1版本,2017年3月7日发布的). 首先在Configure中添加中间件 //添加websocket中间件 app.UseWebSockets(); 接下来就要定义自己处理websocket的中间件了,代码如下: using Microsoft.AspNetCore.Http; using System;

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

HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable)更强,并具有自描述的特点.使用了HAL的API会更容易地被第三方开源库所调用,并且使用起来也很方便,开发者可以像处理普通JSON数据那样去处理API数据.有关HAL的更多信息,可以参考官方网站:http://stateless.co/hal_specification.html.目前,很多REST

ASP.NET Core中使用xUnit进行单元测试

单元测试的功能自从MVC的第一个版本诞生的时候,就是作为一个重要的卖点来介绍的,通常在拿MVC与webform比较的时候,单元测试就是必杀底牌,把webform碾压得一无是处. 单元测试的重要性不用多说了,有单元测试的做兜底的项目,好比给开发人员买了份保险,当然这个保险的质量取决于单元测试的质量,那些一路Mock的单元测试,看起来很美,但是什么都cover不到.目前工作中的一个老项目,有2万多个单元测试用例,其中不少是用心之作,真正落实到了业务逻辑,开发人员可以放心的去修改代码,当然一切都必须按

Asp.Net Core中Json序列化处理整理

一.Asp.Net Core中的Json序列化处理使用的是Newtonsoft.Json,更多参考:C# Newtonsoft.Json JsonSerializerSettings配置序列化操作,C# Json序列化工具--Newtonsoft.Json简介和使用 1.Newtonsoft.Json仅 依赖.Net Standard所以支持.Net Framework也支持.Net Core 2.更多说明 /* * 1.在Core Mvc中JsonResult 默认支持Get请求 * 2.使用

ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程序提供了处理每个请求的完整控制.Startup 类是应用程序的入口(entry point),这个类可以设置配置(configuration)并且将应用程序将要使用的服务连接起来.开发人员可以在 Startup 类中配置请求管道,该管道将用于处理应用程序的所有请求. 章节: Startup 类 Co

【翻译】介绍 ASP.NET Core 中的 Razor Pages

介绍 ASP.NET Core 中的 Razor Pages 原文地址:Introduction to Razor Pages in ASP.NET Core         译文地址:介绍 asp.net core 中的 Razor Pages          翻译:ganqiyin Razor Pages 是 ASP.NET Core MVC 的一个新功能,可以让基于页面的编程方案更容易,更高效. 如果您正在寻找使用 Model-View-Controller 的教程,请参阅ASP.NET

Asp.Net Core中使用Swagger,你不得不踩的坑

很久不来写blog了,换了新工作后很累,很忙.每天常态化加班到21点,偶尔还会到凌晨,加班很累,但这段时间,也确实学到了不少知识,今天这篇文章和大家分享一下:Asp.Net Core中使用Swagger,你不得不踩的坑. 这篇文章着重讲几点: swagger 跨层注释问题 swagger Get请求传多个参数的问题 swagger Enum 注释问题 swagger api文档版本控制 第一步:搭建一个webapi项目或者mvc项目,引入swagger nuget 我创建项目,习惯性的先创建一个

在Asp.Net Core中使用中间件保护非公开文件

在企业开发中,我们经常会遇到由用户上传文件的场景,比如某OA系统中,由用户填写某表单并上传身份证,由身份管理员审查,超级管理员可以查看. 就这样一个场景,用户上传的文件只能有三种人看得见(能够访问) 上传文件的人 身份审查人员 超级管理员 那么,这篇博客中我们将一起学习如何设计并实现一款文件授权中间件 问题分析 如何判断文件属于谁 要想文件能够被授权,文件的命名就要有规律,我们可以从文件命名中确定文件是属于谁的,例如本文例可以设计文件名为这样 工号-GUID-[Front/Back] 例如: 1

【翻译】asp.net core中使用MediatR

这篇文章来自:https://ardalis.com/using-mediatr-in-aspnet-core-apps 本文作为翻译,有一些单词翻译成中文可能会有一些误解(对于读者)或者错误(对于作者)的地方,所以在文章中你可以看到一些单词没有进行翻译.如果有不对的地方,请指出,谢谢. 在Asp.net core中使用MediatR 我已经开始考虑使用MediatR作为我的领域事件实现.为了达到这个目的,我用asp.net core创建了一个示例程序,总的来说是非常容易的,如果你之前没有使用过