无法使最小的ASP .NET Core 3.1 WebSocket示例正常工作

时间:2019-12-11 21:43:20

标签: c# asp.net-core websocket

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

我只是从模板创建一个空的ASP.NET Core 3.1项目并添加: -app.UseWebSockets(); -应用程序-请参见下面的代码 我还会注释掉默认的Routing和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吗?

1 个答案:

答案 0 :(得分:1)

  

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

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

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

使用wss://

enter image description here

使用ws://

enter image description here