簡體   English   中英

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

[英]Can't get minimal ASP .NET Core 3.1 WebSocket example to work

我正在嘗試將舊的 WebSocket 服務器遷移到 ASP.NET Core 3.1。 問題是,即使是最小的示例也不起作用 - 在調試時通過 Web 套接字連接服務器時,沒有執行任何代碼並且 Web 套接字連接超時。

我只是從模板創建空的 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 嗎?

而已! 使用 wss:// 一切正常!

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

此外,正如我們在評論中所討論的,我們應該在開始建立連接之前檢查服務器 URL 和端口。

使用 wss://

在此處輸入圖像描述

使用 ws://

在此處輸入圖像描述

不是這種特殊情況的答案。 但是我碰巧重構后無法連接到wss。 嘗試向您的 websoket 端點發出 GET 請求。 它可能表明您在構造函數中缺少注入依賴項,例如存儲庫或服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM