如何在 ASP.NET Core RC2 中制作 websocket 服务器?

2024-04-01

我使用 "Microsoft.AspNetCore.WebSockets.Server": "0.1.0-rc2-final" 制作 websocket 服务器,但不起作用。 (在rc1中,它是1.0.0-rc1-final,并且工作正常......)

这是我的代码:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseWebSockets();

        app.Use(async (http, next) =>
        {

            if (http.WebSockets.IsWebSocketRequest)
            {
                IHandler handler = WebsocketManager.getHandler(http.Request.Path);
                if (handler == null)
                {
                    await next();
                }
                else
                {
                    var webSocket = await http.WebSockets.AcceptWebSocketAsync();
                    if (webSocket != null && webSocket.State == WebSocketState.Open)
                    {
                        // TODO: Handle the socket here.
                        WebsocketManager.Handle(webSocket, handler);
                    }
                }
            }
            else
            {
                // Nothing to do here, pass downstream.  
                await next();
            }
        });


        app.UseMvc();
    }

WebsocketManager 是我自己的管理器类。 这是我处理 websocket 会话的方式:

    public async Task Listen()
    {
        OnOpen();
        while (_webSocket.State == WebSocketState.Open)
        {
            var error = String.Empty;

            try
            {
                var buffer = new ArraySegment<Byte>(new Byte[4096]);
                var received = await _webSocket.ReceiveAsync(buffer, CancellationToken.None);

                switch (received.MessageType)
                {
                    case WebSocketMessageType.Close:
                        OnClose(received.CloseStatus, received.CloseStatusDescription);
                        break;
                    case WebSocketMessageType.Text:
                        var data = Encoding.UTF8.GetString(buffer.Array, buffer.Offset, buffer.Count).Trim('\0');
                        OnMessage(data);
                        break;
                    case WebSocketMessageType.Binary:
                        OnMessage(buffer.Array);
                        break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                break;
            }
        }
    }

然后,“_webSocket.ReceiveAsync”抛出异常“请求被中止”。

我确信客户端不会关闭会话。

如何修复它?


你需要await这一行: WebsocketManager.Handle(webSocket, handler); 否则请求结束并且资源被释放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ASP.NET Core RC2 中制作 websocket 服务器? 的相关文章

随机推荐

  • Angular2 错误 TS1146:需要声明

    Angular2 新手 我正在使用 Angular io 中的种子文件 但是当我运行 npm start 时 出现 tsc 编译器错误 tsc p src src app app module ts 11 3 错误 TS1146 需要声明
  • 向几何体添加细分

    我正在尝试向球体添加细分 如下所示 http stemkoski github com Three js Subdivision Cube html http stemkoski github com Three js Subdivisio
  • Ajax POST 到控制器操作以更新视图模型,然后重新加载 div

    我仍然对 ajax 的使用感到不安 所以我的实现中存在一些漏洞 我正在尝试发布到一个控制器操作 该操作将调用存储过程来更新我的视图模型 然后重新加载将显示信息的 div 阿贾克斯帖子 order summary panel click fu
  • 在Python中使用@staticmethod和全局函数有什么区别?

    我读过了 staticmethod 和 classmethod 有什么区别 Python https stackoverflow com questions 136097 what is the difference between sta
  • iOS 6 问题将 MPMediaItem 转换为 NSData

    我试过下面的代码 void mediaItemToData MPMediaItem curItem NSURL url curItem valueForProperty MPMediaItemPropertyAssetURL AVURLAs
  • HTML 敏捷包设置

    我正在使用 Agility Pack 来解析 HTML 遵循这个问题在 C 中解析 html 的最佳方法是什么 https stackoverflow com questions 56107 what is the best way to
  • 无法在 VSCode 中调试 Typescript

    这是我的 launch json version 0 2 0 configurations type node name Launch Server request launch program workspaceRoot server s
  • Spring Boot + Gradle - 在哪里放置环境配置?

    我正在 Spring Boot 中开发一个简单的应用程序 它是在本地开发的 并且可以工作 Gradle H2 数据库的连接属性设置为application properties放置在项目的根目录下 Maven 文件夹结构 src main
  • 更改导航栏颜色

    我知道从 API 21 开始可以更改导航栏的颜色 我查看了 React Native 的文档 但找不到方法来做到这一点 我知道的唯一方法是创建一个本机模块 但这似乎不是一个好的解决方案 因为我正在使用 Expo 有内置的方法可以做到这一点吗
  • BizTalk 平面文件架构 - 如何接受 LF 或 CRLF 作为行分隔符

    我们的客户向我们发送一个平面文件作为输入 然后我们将其转换为 XML 文件 然后发送到目标系统 平面文件由多行组成 每行由 LF 或 CRLF 分隔 如何创建平面文件架构 以便 BizTalk 可以解释每一行数据 无论该行是由 LF 0x0
  • ADODB 记录集列标题

    我正在复制ADODB Recordset数据到 Excel 文件 但它将记录集数据复制到 Excel 没有列标题 我使用的是 MS Access 2013 CompyFromRecordset命令 我的问题是 有没有办法复制RecordSe
  • 可视化二分图

    有人可以推荐一个库或代码来可视化 C 中的二分图吗 Graph 似乎不直接支持这种图 但有 一些支持解开顶点 我想创建一些像这样的图形二部图 http upload wikimedia org wikipedia commons e e8
  • 如何使用 spl_autoload() 代替 __autoload()

    根据http php net manual en language oop5 autoload php http php net manual en language oop5 autoload php神奇的功能 autoload 自 PH
  • @singleton 的行为类似于@stateless bean

    我正在开发一个应用程序 java中的企业应用程序 其中我需要由多个线程同时共享的单个实例 我使用了 singleton 当每个用户登录时 通过调用 setTeleCallersDetails 远程方法在电话呼叫者列表中设置一个值 但在某些时
  • 如何从 Hive 中的 json 字符串中提取选定的值

    我在 Hive 中运行一个简单的查询 生成以下输出 以及一些其他附加列 col1 col2 A variable1 123 variable2 456 variable3 789
  • Marshal.GetFunctionPointerForDelegate 如何作用于实例成员?

    我想知道 Marshal GetFunctionPointerForDelegate 即我想知道它如何将委托转换为非静态函数到函数指针 它是否动态生成以某种方式附加实例的代码存根 如果是这样 这不会泄漏内存吗 也许委托在其终结器中释放了它
  • 如何在覆盖控制器后在 activeadmin 表单中显示错误

    我遇到一种情况 我需要覆盖 activeadmin 中的创建 我自动填充字段 如果数据已经存在 则应该更新 否则创建 这是我的创建方法 def create id params company dig id if id present co
  • C# 是否有一种简单的方法可以让我替换多个 if 语句?

    我有以下代码 if testQuestion Result t testQuestion CorrectCount if testQuestion Result f testQuestion IncorrectCount if testQu
  • 结构图 - 同一接口的两个实现

    我有一个具有以下 ctor 的服务类 public class IMessageService emailService IMessageService smsService 和两个实现IMessageService 电子邮件和短信 如何配
  • 如何在 ASP.NET Core RC2 中制作 websocket 服务器?

    我使用 Microsoft AspNetCore WebSockets Server 0 1 0 rc2 final 制作 websocket 服务器 但不起作用 在rc1中 它是1 0 0 rc1 final 并且工作正常 这是我的代码