這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)ASP.NET Core 中WebSocket的作用是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
上海ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!
首先創(chuàng)建一個(gè) ASP.NET 5 WebAPI 項(xiàng)目。
dotnet new webapi -n WebSocketsTutorialdotnet new slndotnet sln add WebSocketsTutorial
現(xiàn)在添加SignalR到項(xiàng)目中。
dotnet add WebSocketsTutorial/ package Microsoft.AspNet.SignalR
示例代碼
我們首先將WebSockets中間件添加到我們的WebAPI應(yīng)用程序中。打開(kāi)Startup.cs,向Configure方法添加下面的代碼。
在本教程中,我喜歡保持簡(jiǎn)單。因此,我不打算討論SignalR。它將完全基于WebSocket通信。你也可以用原始的WebSockets實(shí)現(xiàn)同樣的功能,如果你想讓事情變得更簡(jiǎn)單,你不需要使用SignalR。
app.UseWebSockets();
接下來(lái),我們將刪除默認(rèn)的WeatherForecastController,并添加一個(gè)名為WebSocketsController的新控制器。注意,我們將只是使用一個(gè)控制器action,而不是攔截請(qǐng)求管道。
這個(gè)控制器的完整代碼如下所示。
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
_logger;
public WebSocketsController(ILogger
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
(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
(serverMsg, 0, serverMsg.Length), result.MessageType, result.EndOfMessage, CancellationToken.None); _logger.Log(LogLevel.Information, "Message sent to Client");
result = await webSocket.ReceiveAsync(new ArraySegment
(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、添加一個(gè)名為ws/的新路由。
2、檢查當(dāng)前請(qǐng)求是否通過(guò)WebSockets,否則拋出400。
3、等待,直到客戶端發(fā)起請(qǐng)求。
4、進(jìn)入一個(gè)循環(huán),直到客戶端關(guān)閉連接。
5、在循環(huán)中,我們將發(fā)送“Server: Hello. You said:
6、等待,直到客戶端發(fā)送另一個(gè)請(qǐng)求。
注意,在初始握手之后,服務(wù)器不需要等待客戶端發(fā)送請(qǐng)求來(lái)將消息推送到客戶端。讓我們運(yùn)行應(yīng)用程序,看看它是否工作。
dotnet run --project WebSocketsTutorial
運(yùn)行應(yīng)用程序后,請(qǐng)?jiān)L問(wèn)https://localhost:5001/swagger/index.html,應(yīng)該看到Swagger UI。
現(xiàn)在我們將看到如何讓客戶端和服務(wù)器彼此通信。在這個(gè)演示中,我將使用Chrome的DevTools(打開(kāi)新標(biāo)簽→檢查或按F12→控制臺(tái)標(biāo)簽)。但是,你可以選擇任何客戶端。
首先,我們將創(chuàng)建一個(gè)到服務(wù)器終結(jié)點(diǎn)的WebSocket連接。
let webSocket = new WebSocket('wss://localhost:5001/ws');
它所做的是,在客戶端和服務(wù)器之間發(fā)起一個(gè)連接。wss://是WebSockets安全協(xié)議,因?yàn)槲覀兊腤ebAPI應(yīng)用程序是通過(guò)TLS服務(wù)的。
然后,可以通過(guò)調(diào)用webSocket.send()方法發(fā)送消息。你的控制臺(tái)應(yīng)該類似于下面的控制臺(tái)。
讓我們仔細(xì)看看WebSocket連接
如果轉(zhuǎn)到Network選項(xiàng)卡,則通過(guò)WS選項(xiàng)卡過(guò)濾掉請(qǐng)求,并單擊最后一個(gè)稱為WS的請(qǐng)求。
單擊Messages選項(xiàng)卡并檢查來(lái)回傳遞的消息。在此期間,如果調(diào)用以下命令,將能夠看到“This was sent from the Client!”。試試吧!
webSocket.send("Client: Hello");
如你所見(jiàn),服務(wù)器確實(shí)需要等待客戶端發(fā)送響應(yīng)(即在初始握手之后),并且客戶端可以發(fā)送消息而不會(huì)被阻塞。這是全雙工通信。我們已經(jīng)討論了WebSocket通信的數(shù)據(jù)傳輸方面。作為練習(xí),你可以運(yùn)行一個(gè)循環(huán)將消息推送到客戶機(jī),以查看它的運(yùn)行情況。
除此之外,服務(wù)器和客戶端還可以通過(guò)ping-pong來(lái)查看客戶端是否還活著。這是WebSockets中的一個(gè)實(shí)際特性!如果你真的想看看這些數(shù)據(jù)包,你可以使用像WireShark這樣的工具來(lái)了解。
它是如何握手的?好吧,如果你跳轉(zhuǎn)到Headers選項(xiàng)卡,你將能夠看到我們?cè)谶@篇文章的第一部分談到的請(qǐng)求-響應(yīng)標(biāo)題。
上述就是小編為大家分享的ASP.NET Core 中WebSocket的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。