【问题标题】:Can't get minimal ASP .NET Core 3.1 WebSocket example to work无法使最小的 ASP .NET Core 3.1 WebSocket 示例正常工作
【发布时间】:2019-12-12 17:31:14
【问题描述】:

我正在尝试将我的旧 WebSocket 服务器迁移到 ASP.NET Core 3.1。问题是,即使是最小的示例也无法正常工作 - 在调试时通过 web 套接字连接服务器时,没有执行任何代码并且 websocket 连接超时。

我只是从模板创建空的 ASP.NET Core 3.1 项目并添加: - app.UseWebSockets(); - app.Use - 见下面的代码 我还注释掉了默认路由和 UseEndpoints。

启动代码:


        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseWebSockets();

            app.Use(async (context, next) =>
            {
                if (context.WebSockets.IsWebSocketRequest)
                {
                    WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                    await Echo(context, webSocket);
                }
                else
                {
                    await context.Response.WriteAsync("Not a websocket request");
                    //context.Response.StatusCode = 400;
                }
            });

            //app.UseRouting();
            //app.UseEndpoints(endpoints =>
            //{
            //    endpoints.MapGet("/", async context =>
            //    {
            //        //int a = 0;
            //        await context.Response.WriteAsync("Hello World!");
            //    });
            //});
        }

        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)
            {
                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);
        }

当我通过浏览器/正常 http 请求连接到此服务器时,我得到正确的响应“不是 websocket 请求”。但是当我尝试通过 WebSocket 连接时,没有用户代码被命中。在 ASP .NET Core 2.2 中代码有效。

我必须指定某个地方来接受 WebSockets 吗?

【问题讨论】:

  • when I try to connect via WebSocket, no user code is hit 根据我的测试,WebSockets supports well in .NET Core 3.0。请分享您用于建立连接和交换消息的代码sn-p,以便我们更好地解决问题。
  • @FeiHan 我试图根据该文档制作最小的示例。当我下载从该文档中引用的示例时,它可以工作。但那是 Asp Net Core 2.x。我通过 Firefox Simple WebSocket 客户端或简单的 c# websocket-sharp 代码连接到我的服务器。两者都适用于 2.x 示例。
  • 做了a test using Firefix Simple WebSocket Client plugin,效果很好。我想知道您尝试连接哪一个,ws://wss://
  • 就是这样!使用 wss:// 一切正常! launchSettings.json 中的属性 - “sslPort”:决定何时需要安全的 websocket 连接(创建新项目时的“配置 HTTPS”复选框)
  • 很高兴听到问题已解决。在我们开始建立连接之前,我们应该首先检查服务器 URL 和端口。

标签: c# asp.net-core websocket


【解决方案1】:

就是这样!使用 wss:// 一切正常!

正如我所提到的,WebSockets 很好地支持 ASP.NET Core 3.0 和 3.1。

此外,正如我们在 cmets 中所讨论的,我们应该在开始建立连接之前检查服务器 URL 和端口。

使用 wss://

使用 ws://

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2021-11-02
    • 2020-07-13
    • 2011-11-01
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多