首页 > 其他分享 >webapi添加添加websocket中间件

webapi添加添加websocket中间件

时间:2024-05-03 21:44:08浏览次数:9  
标签:webapi websocket await 中间件 reciveResult 添加 context

添加位置

我按照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
可以看到,服务器复述了消息。

标签:webapi,websocket,await,中间件,reciveResult,添加,context
From: https://www.cnblogs.com/ggtc/p/18171655

相关文章

  • webapi中间件没有使用终结点中间件时的注意事项
    最小webapi默认的中间件配置是这样的app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();最小webapi没有使用app.UseRouting()和app.UseEndpoints。这种情况下我们添加的所有中间件其实都是位于终结点路由中间件EndpointRoutingMiddleware......
  • 使用joinjs绘制流程图(七)-实战-绘制流程图+节点设置样式+节点添加事件
    效果图原理joinjs中通过svg来绘制流程图,然后我们可以使用localToClientRect这个方法对节点(element)复制,它会在原来的element在svg位置上生成一个html元素,但是这样会造成原来的element节点监听的点击事件无法触发,我们可以使用原生来操作对这个元素(比如样式的设置和事件的监听)代......
  • webapi创建和调用WebService
    首先需要引入soapcore包这个包提供了所需的类和soap终结点中间件。引入这个这个包之后,我们需要定义提供的服务。这里我写了一个用于查询省份面积的服务。省份信息服务///<summary>///省份信息服务接口///</summary>[ServiceContract]publicinterfaceIProvinceInfo......
  • [JS]bootstrapTable添加操作按钮
     <scripttype="text/javascript"><!--方法定义-->functionaddFunctionToTable(value,row,index){return['<buttonid="preview"type="button"class="btnbtn-......
  • zotero添加markdown插件(Mac版)
    zotero安装官网下载地址:https://www.zotero.orgmarkdown插件下载下载地址:https://gitcode.com/fei0810/markdownhere4zotero/tree/master选择相应的.xpi文件插件安装步骤打开zotero,选择工具->附加组件选择installadd-onfromfile选中刚才下载的.xpi文件点......
  • FPS游戏里添加物理材质后,没有击中目标时射击会报错的问题
    设置了不同的物理材质后 然后设定了子弹打中不同材质时,播放不同的命中特效 但是如果某次开枪,如果没有击中任何物体,比如天空,远处,子弹无论有没有被销毁,此次射击没有命中目标,那么系统会判定子弹产生的命中特效无访问,应该是找不到生成特效的点 只需要设置个变量布尔值,判断......
  • 给弹框添加关闭按钮
    效果如下:代码:父组件<template><el-containerclass="container"><h1>这是父组件</h1><HelloWorldv-if="detailVisible"msg="WelcometoYourVue.jsApp"@detailClose="detailClose"/><......
  • vxe-table,设置某列不显示时,表头表体对应错乱,添加一行,定位到当前行
    key值原先绑定的是索引,应该绑strfield refreshTable(){this.tableKey= Math.random()}//添加一行<vxe-table     ref="table"     :key="tableKey">methods:{//滚动到左侧this.tableKey=+newDate()setTimeout(()=>{     ......
  • zabbi添加自定义监控项——检查文件是否存在
    1、检查脚本D:/check.pyimportosimportdatetimeimportargparse#获取文件名parser=argparse.ArgumentParser()parser.add_argument('filename')args=parser.parse_args()file_name=args.filename#获取今天日期today=datetime.datetime.today().strftime......
  • 在密码学中,“加盐”(Salting)是指在存储用户密码的哈希值之前,向原始密码添加一个随机生
    在密码学中,“加盐”(Salting)是指在存储用户密码的哈希值之前,向原始密码添加一个随机生成的字符串(称为“盐”Salt)的过程。这个盐值通常是全球唯一的,并且与每个用户账户相关联,存储在数据库中与哈希值一起。加盐的目的主要有两个:抵御彩虹表攻击:彩虹表是一种预先计算好的哈希值对照表......