webapi添加添加websocket中间件
添加位置
我按照MSDN的例子添加了一个复述客户端响应的中间件。需要注意的时,中间件采用那种方式添加,添加在哪。
- 哪种方式
我选择创建一条管道分支,只要时ws的连接请求,就转到这个分支
因此,我们需要使用的是MapWhen()来创建管道分支。 - 添加在哪
要注意授权的问题,所以应该添加到授权中间件之后,也就是UseAuthorization()之后。
至于是放在终结点之后,还是终结点之前,我认为都可以。
请求识别
添加websocket连接阶段也是采用的http请求,因此在添加webservice中间件之前,需要添加UseWebSockets()来识别ws请求。
这个中间件能够将context.WebSockets.IsWebSocketRequest变成true。而这个属性用来识别ws请求。
添加websocket中间件
我们在管道分支处判断一下这个请求是不是ws请求,是的话就进入分支app.MapWhen(c=>c.WebSockets.IsWebSocketRequest, appbuilder =>{})
/创建websocket管道分支,只有websocket连接请求进入这条分支
app.MapWhen(c=>c.WebSockets.IsWebSocketRequest, appbuilder =>
{
//websocket连接授权中间件
appbuilder.Use(async (context, next) =>
{
if (context.User.Identity.IsAuthenticated == false)
{
context.Response.StatusCode = StatusCodes.Status403Forbidden;
}
else
{
await next(context);
}
});
//websocket连接建立中间件
appbuilder.Use(async (context,next) =>
{
await next(context);
//此方法将 TCP 连接升级到 WebSocket 连接,并提供 WebSocket 对象
using (var websocket = await context.WebSockets.AcceptWebSocketAsync())
{
var buffer = new byte[1024 * 4];
//阻塞式调用,接收到消息才会退出,同时把消息写到buffer中
var reciveResult = await websocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
while (!websocket.CloseStatus.HasValue)
{
//复述客户端消息并发回
await websocket.SendAsync(new ArraySegment<byte>(buffer, 0, reciveResult.Count),
reciveResult.MessageType,
reciveResult.EndOfMessage,
CancellationToken.None);
reciveResult = await websocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
}
await websocket.CloseAsync(
reciveResult.CloseStatus!.Value,
reciveResult.CloseStatusDescription,
CancellationToken.None);
}
});
});
当然我socket连接之前还添加了一个授权的中间件,如果不需要可以直接去除。
测试

由于我加了授权,所以这里还要加上请求头。如果没有授权就不需要加了。

可以看到,服务器复述了消息。
webapi添加添加websocket中间件的更多相关文章
- h5 页面点击添加添加input框
h5 页面点击添加添加input框 前段时间有个需求,页面要能点击添加按钮控制input框的个数,当时感觉有点难,就没做,这两个又遇到了,没办法写了个简单的 效果图,加号增加,减号减少 直接上代码, ...
- 万能分布式消费框架,添加基于redis中间件的方式。
框架目的是分布式调度起一切任何函数(当然也包括调度起一切任何方法). 之前写的是基于rabbitmq的,作为专用的消息队列好处比redis的list结构好很多.但有的人还是强烈喜欢用redis,以及r ...
- ASP.Net WebAPI中添加helppage帮助页面
一.自动创建带帮助的WebAPI 1.首先创建项目的时候选择WebAPI,如下图所示,生成的项目会自动生成帮助文档. 2.设置调用XML文档的代码 3.设置项目注释XML文档生成目录,项目——属性—— ...
- WebAPI项目添加定时服务
开发平台: VS2019 背景: 在开发小程序的API服务的时候,由于access_token的有效期为7200秒,也就是2小时,这就需要后端定时的去更新这个access_token,便于调用小程序的 ...
- dotnet webapi 中添加Swagger文档
首先添加"SwaggerGenerator": "1.1.0","SwaggerUi": "1.1.0" 需要注意的是这 ...
- autoMapper dotnetcore webapi 自动添加映射 abp
在ef的xxxxApplicationModule的Initialize方法中,已经添加了自动映射的配置,如下图: 写的很明白了,我们只需要写一个类继承Profile就可以了.如下图所示: 这样就可以 ...
- webAPI过滤器添加参数签名
项目需求: 接口对安卓和IOS开发接口,需要房子用户窜改数据请求接口.添加sign签名校验参数. 代码如下:加上特性标签就可以控制部分接口验证 public class SignAuthorizeFi ...
- 为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_67 websocket是个啥? webSocket是一种在单个TCP连接上进行全双工通信的协议 webSocket使得客户端和服务 ...
- ASP.NET Core WebApi AspNetCoreRateLimit 限流中间件学习
AspNetCoreRateLimit介绍: AspNetCoreRateLimit是ASP.NET核心速率限制框架,能够对WebApi,Mvc中控制限流,AspNetCoreRateLimit包包含 ...
- asp.net core系列 37 WebAPI 使用OpenAPI (swagger)中间件
一.概述 在使用Web API时,对于开发人员来说,了解其各种方法可能是一项挑战.在ASP.NET Core上,Web api 辅助工具介绍二个中间件,包括:Swashbuckle和NSwag .NE ...
随机推荐
- Qt数据结构-QString二:QString的arg能不能像Python的format一样使用
常规QString拼接字符串我们是这样写的 QString s = QString("My name is %1, age %2").arg("zhangsan" ...
- Velero系列文章(五):基于 Velero 的 Kubernetes 集群备份容灾生产最佳实践
考量维度 基于CSI 快照 基于Restic 文件复制 应用性能影响 低,CSI 接口调用存储系统快照 取决于数据量,占用额外资源 数据可用性 依赖于存储系统 对象存储和生产环境隔离,独立可用性,支持 ...
- k8s 深入篇———— pod 深入实战[七]
前言 深入一下pod 实战. 正文 在 Kubernetes 中,有几种特殊的 Volume,它们存在的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换. 这些特殊 Volume ...
- k8s 深入篇———— pod 实战[六]
前言 pod 实战一下,主要是一些例子. 正文 例子一 pod 实例的选择: NodeSelector:是一个供用户将 Pod 与 Node 进行绑定的字段 NodeName:一旦 Pod 的这个字段 ...
- android 关于插件包内的依赖版本不一致问题得解决
前言 今天使用一个插件包的时候,依赖包冲突了,在此记录一下. 正文 在引用一个: debugImplementation 'com.squareup.leakcanary:leakcanary-and ...
- mockjs 模拟实现增删改查
/*mUtils.js用于解析get请求的参数*/ export const param2Obj = url => { const search = url.split('?')[1] if ( ...
- 剑指offer004(Java)-只出现一次的数字(中等)
题目: 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回那个只出现了一次的元素. 示例1: 输入:nums = [2,2,3,2] 输出:3 示例 ...
- 力扣171(java)-Excel表列序号(简单)
题目: 给你一个字符串 columnTitle ,表示 Excel 表格中的列名称.返回 该列名称对应的列序号 . 例如: A -> 1B -> 2C -> 3...Z -> ...
- ClickHouse Keeper 源码解析
简介:ClickHouse 社区在21.8版本中引入了 ClickHouse Keeper.ClickHouse Keeper 是完全兼容 Zookeeper 协议的分布式协调服务.本文对开源版本 C ...
- 基于 MaxCompute + Hologres 的人群圈选和数据服务实践
简介: 本文主要介绍如何通过 MaxCompute 进行海量人群的标签加工,通过 Hologres 进行分析建模,从而支持大规模人群复杂圈选场景下的交互式体验,以及基于API的数据服务最佳实践. 本 ...