GetProgress 方法深度解析一、方法概述GetProgress是一个基于Server-Sent Events (SSE)技术实现的实时进度推送接口是整个任务进度跟踪系统的核心组件。核心职责建立客户端与服务端的长连接实时监控任务进度变化增量推送进度更新给前端任务完成后自动断开连接二、技术原理SSE 协议简介Server-Sent Events是一种单向实时通信协议特性说明通信方向服务端 → 客户端单向连接方式基于 HTTP 的长连接数据格式data: {JSON}\n\n自动重连客户端自动尝试重连兼容性现代浏览器均支持与传统轮询的对比对比项轮询 (Polling)SSE请求方式客户端主动轮询服务端主动推送连接状态短连接频繁建立长连接持续保持实时性取决于轮询间隔实时推送资源消耗较高重复建立连接较低复用连接三、核心实现解析3.1 参数校验与错误处理[HttpGet({taskId}/progress)]publicasyncTaskGetProgress(stringtaskId){// 任务存在性校验if(!_taskService.TaskExists(taskId)){Response.StatusCode404;awaitResponse.WriteAsync(任务不存在);return;}// ...}设计要点采用快速失败策略避免无效的长连接占用资源直接操作Response对象返回错误无需经过 MVC 管道3.2 SSE 响应头配置Response.Headers[Content-Type]text/event-stream;Response.Headers[Cache-Control]no-cache;Response.Headers[Connection]keep-alive;响应头说明响应头值作用Content-Typetext/event-stream标识 SSE 流格式Cache-Controlno-cache禁用缓存保证实时性Connectionkeep-alive维持长连接状态3.3 核心循环逻辑varlastProgress-1;varcompletedfalse;while(!completed){// 获取最新任务状态vartask_taskService.GetTask(taskId);if(tasknull)break;// 增量推送仅在进度变化时发送if(task.Progress!lastProgress){lastProgresstask.Progress;vardatanew{TaskIdtask.TaskId,Progresstask.Progress,Statustask.Status,Messagetask.Message,Resulttask.Result};varjsonSystem.Text.Json.JsonSerializer.Serialize(data);awaitResponse.WriteAsync($data:{json}\n\n);awaitResponse.Body.FlushAsync();}// 任务完成检测if(task.Statuscompleted||task.Statusfailed){completedtrue;break;}// 500ms 轮询间隔awaitTask.Delay(500);}执行流程┌─────────────────────────────────────────────────────────────┐│ GetProgress 主循环 │├─────────────────────────────────────────────────────────────┤│ ││ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ││ │ 获取任务信息 │───→│ 进度变化检测 │───→│ 增量推送更新 │ ││ └──────────────┘ └──────────────┘ └──────────────┘ ││ │ │ │ ││ ↓ ↓ ↓ ││ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ││ │ 任务完成检测 │←───│ 延迟500ms │←───│ 刷新响应流 │ ││ └──────────────┘ └──────────────┘ └──────────────┘ ││ │ ││ ↓ ││ ┌──────────────┐ ││ │ 退出循环 │ ││ └──────────────┘ ││ │└─────────────────────────────────────────────────────────────┘3.4 SSE 数据格式推送的数据结构字段类型说明TaskIdstring任务唯一标识Progressint进度百分比 (0-100)Statusstring任务状态Messagestring进度描述信息Resultstring任务结果完成时状态枚举状态值含义pending任务已创建等待执行processing任务正在执行中completed任务执行完成failed任务执行失败实际推送示例思考过程GetProgress 方法解读方法概述这是一个 SSE (Server-Sent Events) 实时进度推送接口 是整个进度跟踪系统的核心方法允许服务器主动向客户端推送任务进度更新。技术原理Server-Sent Events (SSE) 是一种单向的实时通信协议客户端发起一次 HTTP 请求建立长连接服务器通过该连接持续推送事件无需客户端反复轮询效率更高核心流程代码逐段解析 1. 参数校验与错误处理首先检查任务是否存在不存在则直接返回 404 错误 2. SSE 响应头设置响应头 作用 Content-Type: text/event-stream 告知客户端这是 SSE 流 Cache-Control: no-cache 禁止缓存确保实时性 Connection: keep-alive 保持长连接核心循环逻辑工作流程步骤 操作 说明 1 获取任务信息 从 TaskProgressService 获取当前任务状态 2 检测进度变化 只有进度改变时才推送避免无效推送 3 构建并发送 SSE 事件 序列化任务数据为 JSON 4 检查任务状态 任务完成或失败时退出循环 5 延迟等待 每 500ms 检查一次4. SSE 数据格式推送的数据格式与前端的交互前端使用 EventSource 连接设计亮点特性 实现方式 优势 增量推送 只在进度变化时推送 减少网络流量 长连接复用 使用 SSE 协议 比轮询更高效 自动断开 任务完成后退出循环 避免资源浪费 低延迟 500ms 检查间隔 平衡性能与实时性总结GetProgress 方法是一个 基于 SSE 的实时进度推送端点 通过长连接和增量更新机制实现了高效的服务端主动推送是前端进度条实时更新的核心技术支撑。四、前端消费方式4.1 EventSource 连接consteventSourcenewEventSource(/api/tasks/{taskId}/progress);eventSource.onmessage(event){constdataJSON.parse(event.data);updateProgress(data.Progress,data.Message);};eventSource.onerror(){console.error(SSE 连接失败);eventSource.close();};4.2 生命周期管理// 组件挂载时建立连接onMounted((){eventSourcenewEventSource(url);});// 组件卸载时关闭连接onUnmounted((){eventSource?.close();});五、设计亮点与架构考量5.1 增量推送策略问题如果每次循环都推送数据会造成大量无效网络传输。解决方案通过lastProgress变量记录上次推送的进度值仅在进度变化时才发送数据。if(task.Progress!lastProgress){lastProgresstask.Progress;// 推送更新...}5.2 优雅的连接管理自动断开机制if(task.Statuscompleted||task.Statusfailed){completedtrue;break;}优势任务完成后自动释放资源避免僵尸连接占用服务器资源客户端收到最终状态后可安全关闭连接5.3 性能优化优化点实现方式效果减少推送频率500ms 检查间隔平衡实时性与性能增量更新仅推送变化数据减少网络流量对象池复用TaskProgressService单例减少对象创建开销5.4 线程安全考虑由于TaskProgressService是单例服务多个请求可能同时访问同一任务数据// TaskProgressService 中的更新方法publicvoidUpdateTask(stringtaskId,intprogress,stringstatus,stringmessage){if(_tasks.TryGetValue(taskId,outvartask)){task.Progressprogress;task.Statusstatus;task.Messagemessage;}}六、应用场景与扩展6.1 适用场景场景说明文件上传进度实时显示上传百分比数据处理进度批量任务执行进度展示报表生成进度复杂报表生成状态追踪长时间任务监控CI/CD 流水线状态监控6.2 扩展方向1. 多任务订阅支持客户端订阅多个任务使用EventSource的event字段区分任务2. 心跳机制添加定期心跳包检测连接状态异常断开时自动重连3. 历史进度查询保存任务进度历史支持进度回放功能4. 权限控制增加任务访问权限校验支持任务隔离七、总结GetProgress方法通过 SSE 技术实现了高效的实时进度推送核心优势低延迟服务端主动推送无需客户端轮询高效率增量更新策略减少网络流量高可靠任务完成自动断开避免资源泄漏易集成标准 SSE 协议前端实现简单技术价值该方法展示了如何在 ASP.NET Core 中实现轻量级实时通信为耗时操作提供直观的进度反馈提升用户体验。