.NET 8 API 实现websocket,并在前端angular实现调用

.NET 8 API 实现websocket,并在前端angular实现调用。

后端:.NET 8 WebSocket API 实现

在 .NET 8 中,可以通过 Microsoft.AspNetCore.WebSockets 提供的支持来实现 WebSocket 功能。以下是创建一个简单的 WebSocket 控制器的步骤。

安装必要的 NuGet 包

需要确保项目已启用 WebSocket 支持。如果尚未配置,请在项目的依赖项中添加以下包:

Bash 复制代码
dotnet add package Microsoft.AspNetCore.WebSockets

配置中间件支持 WebSocket

在 Program.cs 文件中注册并启用 WebSocket 中间件:

C# 复制代码
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

// 添加服务到容器
builder.Services.AddHttpContextAccessor();
builder.Services.AddControllers();

var app = builder.Build();

app.Use(async (context, next) =>
{
    if (context.Request.Path == "/ws") // 设置 WebSocket 终结点路径
    {
        if (context.WebSockets.IsWebSocketRequest)
        {
            using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
            await HandleWebSocketConnection(webSocket);
        }
        else
        {
            context.Response.StatusCode = StatusCodes.Status400BadRequest;
        }
    }
    else
    {
        await next(context);
    }
});

app.MapControllers();
app.Run();

static async Task HandleWebSocketConnection(System.Net.WebSockets.WebSocket socket)
{
    var buffer = new byte[1024 * 4];
    WebSocketReceiveResult result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

    while (!result.CloseStatus.HasValue)
    {
        Console.WriteLine($"Received message: {System.Text.Encoding.UTF8.GetString(buffer)}");
        await socket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
        result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
    }

    await socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}

上述代码实现了基本的 WebSocket 连接逻辑5。它监听 /ws 路径上的请求,并允许客户端通过 WebSocket 协议与其交互。

前端:Angular WebSocket 服务实现

为了在前端调用后端的 WebSocket 接口,可以基于前面提到的 Angular WebSocket 服务模板进行扩展。

创建 WebSocket 服务

创建一个新的服务文件 websocket.service.ts,用于管理 WebSocket 连接和消息传递。

TypeScript 复制代码
                  
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class WebsocketService {

  private socket: WebSocket | null = null;
  private subject$: Subject<string> = new Subject<string>();

  constructor() {}

  public connect(url: string): void {
    this.socket?.close();
    this.subject$ = new Subject<string>();
    this.socket = new WebSocket(url);

    this.socket.onopen = () => {
      console.log('WebSocket connection established');
    };

    this.socket.onerror = (error) => {
      console.error('WebSocket error:', error);
    };

    this.socket.onmessage = (event) => {
      this.subject$.next(event.data);
    };

    this.socket.onclose = () => {
      console.warn('WebSocket connection closed');
      this.subject$.complete();
    };
  }

  public sendMessage(message: string): void {
    if (this.socket && this.socket.readyState === WebSocket.OPEN) {
      this.socket.send(message);
    }
  }

  public getMessages(): Observable<string> {
    return this.subject$.asObservable();
  }

  public close(): void {
    if (this.socket) {
      this.socket.close();
    }
  }
}

此服务提供了连接、发送消息以及接收消息的功能6。

组件中使用 WebSocket 服务

下面是一个简单示例,展示如何在 Angular 组件中初始化 WebSocket 并收发消息。

TypeScript 复制代码
                  
import { Component, OnInit, OnDestroy } from '@angular/core';
import { WebsocketService } from './websocket.service';

@Component({
  selector: 'app-root',
  template: `
    <h1>WebSocket Example</h1>
    <button (click)="sendMessage()">Send Message</button>
    <ul>
      <li *ngFor="let msg of messages">{{msg}}</li>
    </ul>
  `,
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit, OnDestroy {
  messages: string[] = [];

  constructor(private wsService: WebsocketService) {}

  ngOnInit(): void {
    this.wsService.connect('ws://localhost:5000/ws'); // 替换为实际的 URL
    this.wsService.getMessages().subscribe((msg) => {
      this.messages.push(msg);
    });
  }

  ngOnDestroy(): void {
    this.wsService.close();
  }

  sendMessage(): void {
    this.wsService.sendMessage('Hello from client!');
  }
}

以上代码展示了如何启动 WebSocket 连接,在按钮点击时向服务器发送消息,并实时更新页面显示收到的消息列表7。

数据流说明

整个流程涉及以下几个部分的数据流动:

客户端发起 WebSocket 请求至指定终结点。

服务器接受请求并建立双向通信通道。

双方可通过此通道自由交换 JSON 字符串或其他二进制数据形式的信息8。

相关推荐
摆烂大大王21 分钟前
玩转 OpenClaw:用 TaskFlow + Heartbeat 打造自动化工作流
前端·人工智能·自动化
zhangxingchao26 分钟前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
梦想的颜色35 分钟前
TypeScript 完全指南(上):从零开始掌握类型系统
前端·typescript
之歆1 小时前
Day01_ES6+ 专业指南:从基础到实战的现代JavaScript开发(下)
前端·javascript·es6
lichenyang4531 小时前
鸿蒙 MVVM 实战:从 Demo 到工程化,聊聊登录、状态管理与埋点系统设计
前端
IT_陈寒2 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
kyriewen2 小时前
AI生成代码快如闪电,但我修了三个小时——它到底帮了谁?
前端·javascript·ai编程
ayqy贾杰3 小时前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理
Apifox3 小时前
Apifox 5 月更新|Postman 导入优化、Runner 支持非 root 运行、请求代码自动带鉴权
前端·后端·安全
miaowmiaow3 小时前
PSD2Code 近期更新与深度解析:从设计稿到生产级代码的完整技术栈
前端·人工智能·ai编程