您好,登錄后才能下訂單哦!
這期內(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。
現(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)該類似于下面的控制臺。
讓我們仔細(xì)看看WebSocket連接
如果轉(zhuǎn)到Network選項卡,則通過WS選項卡過濾掉請求,并單擊最后一個稱為WS的請求。
單擊Messages選項卡并檢查來回傳遞的消息。在此期間,如果調(diào)用以下命令,將能夠看到“This was sent from the Client!”。試試吧!
webSocket.send("Client: Hello");
如你所見,服務(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的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(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)容。