webapi添加添加websocket中间件

news/2024/10/12 12:22:43

添加位置

我按照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连接之前还添加了一个授权的中间件,如果不需要可以直接去除。

测试

image
由于我加了授权,所以这里还要加上请求头。如果没有授权就不需要加了。
image
可以看到,服务器复述了消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/27265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

团队作业5

这个作业属于哪个课程 <软件工程2024-双学位>这个作业要求在哪里 <团队作业5>代码地址:gitcode链接 一、功能介绍 登录账号功能查看课表功能与帮助和说明二、环境要求 该软件以微信小程序形式存在,需要能使用小程序的微信版本,无需特意安装,只需安装微信。 bug…

U423621 [HDK - NRC] Sqen Paradox

[HDK - NRC] Sqen Paradox 题目描述 给定一个长度为 \(n\) 的数列 \(S\). 询问在给定区间 \([l,r]\) 内最长的没有重复元素的区间长度. 输入格式 第一行两个整数 \(n,m\). 第二行 \(n\) 个整数,描述数列 \(S\). 随后 \(m\) 行,每行一个询问. 输出格式 \(m\) 行,请你对每个询…

Hexo-Matery主题评论插件

matery主题集成了各种评论模块,例如 gitalk、gitment、disqus、livere、valine、waline、Twikoo、utteranc 等,但我使用最好的还是 utteranc 这种集成在github种的评论插件,并且能够做到github邮箱通知。 1. 新建一个评论仓库 首先创建一个公开的评论仓库<自定义名称>…

DHU网络攻防靶场攻击记录

DHU网络靶场攻击记录 已知:靶场入口10.199.227.xxx 不完整的网络拓扑图:环境准备:kali/wsl-kali/虚拟机kali以及windows或其他操作系统的本机 工具准备:Fscan nmap laravel-CVE-2021-3129-EXP-main 哥斯拉 Burpsuite msfconsole(主要)目录DHU网络靶场攻击记录如何挂代理入…

运算符重载

运算符重载 基本规则 可以重载的运算符:不可重载的运算符://返回类型 operator后面加运算符(参数列表) //eg. Integer operator+(Integer l, Integer r);class Integer{ public:Integer(int n = 0) : i(n) {}const Integer operator+(const Integer& v){ //在类中定义运…

图的概念、存储与遍历

相关概念图 (graph) 是一个二元组 \(G=(V(G),E(G))\)。其中 \(V(G)\) 是非空集,称为 点集 (vertex set),对于 \(V\) 中的每个元素,我们称其为 顶点 (vertex) 或 节点 (node),简称 点;\(E(G)\) 为 \(V(G)\) 结点之间边的集合,称为 边集 (edge set)。 ​ …