溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET Core 中WebSocket的作用是什么

發(fā)布時間:2021-07-15 14:38:22 來源:億速云 閱讀:272 作者:Leah 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)ASP.NET Core 中WebSocket的作用是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

首先創(chuàng)建一個 ASP.NET 5 WebAPI 項目。

dotnet new webapi -n WebSocketsTutorialdotnet new slndotnet sln add WebSocketsTutorial
  

現(xiàn)在添加SignalR到項目中。

dotnet add WebSocketsTutorial/ package Microsoft.AspNet.SignalR
      

示例代碼

我們首先將WebSockets中間件添加到我們的WebAPI應(yīng)用程序中。打開Startup.cs,向Configure方法添加下面的代碼。

在本教程中,我喜歡保持簡單。因此,我不打算討論SignalR。它將完全基于WebSocket通信。你也可以用原始的WebSockets實現(xiàn)同樣的功能,如果你想讓事情變得更簡單,你不需要使用SignalR。

app.UseWebSockets();
   
   

接下來,我們將刪除默認(rèn)的WeatherForecastController,并添加一個名為WebSocketsController的新控制器。注意,我們將只是使用一個控制器action,而不是攔截請求管道。

這個控制器的完整代碼如下所示。

using System;using System.Net.WebSockets;using System.Text;using System.Threading;using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;using Microsoft.Extensions.Logging;namespace WebSocketsTutorial.Controllers{    [ApiController]    [Route("[controller]")]    public class WebSocketsController : ControllerBase    {        private readonly ILogger<WebSocketsController> _logger;
       public WebSocketsController(ILogger<WebSocketsController> logger)        {            _logger = logger;        }
       [HttpGet("/ws")]        public async Task Get()        {          if (HttpContext.WebSockets.IsWebSocketRequest)          {              using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();              _logger.Log(LogLevel.Information, "WebSocket connection established");              await Echo(webSocket);          }          else          {              HttpContext.Response.StatusCode = 400;          }        }                private async Task Echo(WebSocket webSocket)        {            var buffer = new byte[1024 * 4];            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);            _logger.Log(LogLevel.Information, "Message received from Client");
           while (!result.CloseStatus.HasValue)            {                var serverMsg = Encoding.UTF8.GetBytes($"Server: Hello. You said: {Encoding.UTF8.GetString(buffer)}");                await webSocket.SendAsync(new ArraySegment<byte>(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None);                _logger.Log(LogLevel.Information, "Message sent to Client");
               result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);                _logger.Log(LogLevel.Information, "Message received from Client");                            }            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);            _logger.Log(LogLevel.Information, "WebSocket connection closed");        }    }}


這是我們所做的。

1、添加一個名為ws/的新路由。

2、檢查當(dāng)前請求是否通過WebSockets,否則拋出400。

3、等待,直到客戶端發(fā)起請求。

4、進(jìn)入一個循環(huán),直到客戶端關(guān)閉連接。

5、在循環(huán)中,我們將發(fā)送“Server: Hello. You said: <client’s message>”信息,并把它發(fā)回給客戶端。

6、等待,直到客戶端發(fā)送另一個請求。

注意,在初始握手之后,服務(wù)器不需要等待客戶端發(fā)送請求來將消息推送到客戶端。讓我們運行應(yīng)用程序,看看它是否工作。

dotnet run --project WebSocketsTutorial
   


運行應(yīng)用程序后,請訪問https://localhost:5001/swagger/index.html,應(yīng)該看到Swagger UI。

ASP.NET Core 中WebSocket的作用是什么

現(xiàn)在我們將看到如何讓客戶端和服務(wù)器彼此通信。在這個演示中,我將使用Chrome的DevTools(打開新標(biāo)簽→檢查或按F12→控制臺標(biāo)簽)。但是,你可以選擇任何客戶端。

首先,我們將創(chuàng)建一個到服務(wù)器終結(jié)點的WebSocket連接。

let webSocket = new WebSocket('wss://localhost:5001/ws');
   


它所做的是,在客戶端和服務(wù)器之間發(fā)起一個連接。wss://是WebSockets安全協(xié)議,因為我們的WebAPI應(yīng)用程序是通過TLS服務(wù)的。

然后,可以通過調(diào)用webSocket.send()方法發(fā)送消息。你的控制臺應(yīng)該類似于下面的控制臺。

ASP.NET Core 中WebSocket的作用是什么

讓我們仔細(xì)看看WebSocket連接

如果轉(zhuǎn)到Network選項卡,則通過WS選項卡過濾掉請求,并單擊最后一個稱為WS的請求。

單擊Messages選項卡并檢查來回傳遞的消息。在此期間,如果調(diào)用以下命令,將能夠看到“This was sent from the Client!”。試試吧!

webSocket.send("Client: Hello");
   

ASP.NET Core 中WebSocket的作用是什么

如你所見,服務(wù)器確實需要等待客戶端發(fā)送響應(yīng)(即在初始握手之后),并且客戶端可以發(fā)送消息而不會被阻塞。這是全雙工通信。我們已經(jīng)討論了WebSocket通信的數(shù)據(jù)傳輸方面。作為練習(xí),你可以運行一個循環(huán)將消息推送到客戶機,以查看它的運行情況。

除此之外,服務(wù)器和客戶端還可以通過ping-pong來查看客戶端是否還活著。這是WebSockets中的一個實際特性!如果你真的想看看這些數(shù)據(jù)包,你可以使用像WireShark這樣的工具來了解。

它是如何握手的?好吧,如果你跳轉(zhuǎn)到Headers選項卡,你將能夠看到我們在這篇文章的第一部分談到的請求-響應(yīng)標(biāo)題。

ASP.NET Core 中WebSocket的作用是什么


上述就是小編為大家分享的ASP.NET Core 中WebSocket的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI