.net5 WebAPI中搭建WebSocket服务端

18 篇文章 3 订阅

背景:需要开发一个WebSocket服务端,用来向h5客户端推送消息;以前的做法是直接做一个windows服务,专门开一个端口来进行WebSocket连接,现在可以在.net5 WebAPI中直接支持WebSocket,且不用单开端口

使用步骤:

1.在Startup.cs的Configure中启用WebSocket中间件

 app.UseWebSockets();

2.在控制器中添加Action,来接收WebSocket客户端的连接和处理接收、发送消息,关闭连接;

      [HttpGet("/ws")]
        public async Task Get()
        {
            if (HttpContext.WebSockets.IsWebSocketRequest)
            {
                //接受websocket客户端连接
                using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
                await Echo(webSocket);
            }
            else
            {
                //不是websocket客户端请求
                HttpContext.Response.StatusCode = 400;//
            }
        }
        /// <summary>
        /// 对客户端的处理,接受消息,发送消息,关闭连接
        /// </summary>
        /// <param name="webSocket"></param>
        /// <returns></returns>
        private async Task Echo(WebSocket webSocket)
        {
            var buffer = new byte[1024 * 4];
            var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

            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);
                //继续接受客户端消息
                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            }
            //关闭释放与客户端连接
            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
        }

3.具体可以按照自己的业务来做,比如存储一个客户端字典来维护,指定客户端进行发送消息。

4.H5上操作就是这样:

let ws = new WebSocket('ws://api.zhandian.com/ws');//连接的就是api网站的地址
ws.onmessage = function (e) {
                //监听消息
                console.log(e);
                console.log(e.data);
            };

当然我现在websocket客户端不多,还不知道客户端多的话,这样会不会影响api接口,等待验证

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
.NET Core Web Api,你可以使用SignalR来实现WebSocket通信。SignalR提供了一种简单的方式来处理WebSocket连接和消息的接收和发送,同时也支持其他传输协议,如Server-Sent Events和Long Polling。 要使用SignalR,你需要安装Microsoft.AspNetCore.SignalR包。你可以使用NuGet包管理器或在项目文件手动添加依赖项。在安装完成后,你可以创建一个Hub类来处理WebSocket连接和消息的接收和发送。 例如,你可以创建一个名为ChatHub的类: ```csharp using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } } ``` 在上面的代码,SendMessage方法用于接收客户发送的消息,并使用Clients.All.SendAsync方法向所有连接的客户发送消息。ReceiveMessage是客户用于接收消息的方法名称。 现在,你需要在Startup.cs文件配置SignalR间件。在ConfigureServices方法,你需要添加SignalR服务: ```csharp services.AddSignalR(); ``` 在Configure方法,你需要将SignalR间件添加到请求管道: ```csharp app.UseSignalR(routes => { routes.MapHub<ChatHub>("/chatHub"); }); ``` 在上面的代码,/chatHub是WebSocket的URL路径,ChatHub是你创建的Hub类。 最后,在客户,你需要使用SignalR客户库来连接到WebSocket,并使用on方法来接收服务器发送的数据。 例如,你可以使用如下代码连接到ChatHub: ```javascript import * as signalR from "@microsoft/signalr"; const connection = new signalR.HubConnectionBuilder() .withUrl("/chatHub") .build(); connection.start().then(() => { console.log("WebSocket connected"); }); export default connection; ``` 然后,你可以使用on方法接收服务器发送的数据: ```javascript import connection from "./connection"; connection.on("ReceiveMessage", (user, message) => { console.log(user + " says: " + message); }); ``` 这样,你就可以使用SignalR在.NET Core Web Api配置WebSocket通信了。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值