Releases: simplerjiang/baostock.NET
v1.3.4 — RFC 7233 完全合规 + Actions 升级
v1.3.4 — RFC 7233 完全合规 + Actions Node.js 24 升级
发布日期:2026-04-25
NuGet:https://www.nuget.org/packages/Baostock.NET/1.3.4
概述
清理 v1.3.3 已知瑕疵 + 应对 GitHub Actions Node.js 20 弃用(2026-06-02 截止)+ 工作区维护。无 Breaking Changes。
修复 + 维护
Task 1:416 响应 Content-Range RFC 7233 完全合规
v1.3.3 中 416 响应使用 Content-Range: bytes */*,不符合 RFC 7233 §4.2 的 unsatisfied-range = "*/" complete-length 要求。
v1.3.4 修复:416 之前先调上游拿 total 字节数,以 bytes */<total> 返回。
副效益:
- 起始越界请求(如
bytes=999999-)现在能正确返 416 + total,v1.3.3 会盲目 200 透传 - end 越界请求(如
bytes=0-999999)按规范截断到total-1
Task 2:GitHub Actions Node.js 24 升级
应对 GitHub 2026-06-02 强制弃用 Node.js 20:
| Action | v1.3.3 | v1.3.4 |
|---|---|---|
| actions/checkout | v4 | v6 |
| actions/setup-dotnet | v4 | v5 |
| actions/upload-artifact | v4 | v7 |
| actions/upload-pages-artifact | v3 | v5 |
| actions/deploy-pages | v4 | v5 |
三个 workflow(ci.yml / docs.yml / release.yml)全部更新。
Task 3:.gitignore 增补 + 工作区清理
追加 tmp_* / test_output.log / *.local.log 规则;清理 17 个未跟踪 tmp 文件。
内部
- TestUI
pdf-download新增私有SkipExactAsync(ResponseOwnedStream不支持 Seek,206 切片通过 read-discard) - 416 路径补 stream dispose
测试
- 307 passed / 0 failed / 1 skipped(基线一致)
- 0 warning / 0 error
- Test Agent 独立全量回归 PASS(8/8 Range 矩阵 + 5/5 端点回归)
Breaking Changes
无。
升级
<PackageReference Include="Baostock.NET" Version="1.3.4" />v1.3.3 — v1.3.2 契约缺陷热修
v1.3.3 — v1.3.2 契约缺陷热修
发布日期:2026-04-25
NuGet:https://www.nuget.org/packages/Baostock.NET/1.3.3
概述
经 Test Agent 全量遍历发现 v1.3.2 三项 Minor feature 均存在契约缺陷,本版本一并修复。无功能回归,无 Breaking Changes。
修复
Bug-1(HIGH):meta 自洽
/api/meta/endpoints 元数据中 3 个内部端点(session/status、meta/endpoints、loadtest/list-targets)原声明 method=POST,实际仅接受 GET。前端按 meta 驱动调用会拿到 405。修正 EndpointDescriptor.Method 为 "GET"。
Bug-2(HIGH):multi/* sources 字段补齐
/api/multi/realtime-quote、realtime-quotes、history-k-line 三个对冲端点 envelope 缺失 sources 字段。EndpointRegistry.BuildMulti 三处 RoutedEndpoint 补齐 SourcesExtractor,envelope 现正确返回 sources: ["Sina"] 等命中源标识。
Bug-3(MEDIUM):pdf-download Range 完整 RFC 7233
- 支持
bytes=A-与bytes=A-B两种格式 - 不支持格式 → 416
- 206 响应必带
Content-Range: bytes A-B/total - 200 FULL 响应必带
Accept-Ranges: bytes - 6 案例矩阵实测全部符合规范
附属
CninfoSource.ResponseOwnedStream.Length回落读Content-Length,保Content-Rangetotal 准确- 新增
CninfoSourceRangeTests(2 cases) README.UserAgentTest.md增加 v1.3.3 验收段
测试
- 307 passed / 0 failed / 1 skipped(v1.3.2 基线 +2)
- 0 warning / 0 error
- Test Agent 独立全量回归 PASS(不依赖 Dev 自验)
已知瑕疵(非阻断)
416 响应 Content-Range 当前 bytes */*,RFC 7233 §4.2 要求 bytes */<complete-length>。留 v1.3.4 顺手优化。
Breaking Changes
无。
升级
<PackageReference Include="Baostock.NET" Version="1.3.3" />v1.3.2 — API 可观测性 + Range 支持
v1.3.2 — API 可观测性 + Range 支持 + method 字段
发布日期:2026-04-25
NuGet:https://www.nuget.org/packages/Baostock.NET/1.3.2
优化
修复 v1.3.0 UR 验收发现的 3 项 Minor:
Bug-N-02:响应顶层暴露 sources 字段
HTTP 多源端点(财报三表 / 巨潮公告)的 ApiResult envelope 新增 sources: string[] 字段:
- 财报:
["EastMoney"]或["Sina"](Hedged 对冲胜出方) - 巨潮:
["Cninfo"](单源一致性)
TCP 端点 JSON 序列化不受影响(JsonIgnoreCondition.WhenWritingNull)。
Bug-N-04:TestUI PDF 下载支持 Range 请求
/api/cninfo/pdf-download 端点解析 HTTP Range: bytes=N- 请求头并正确转发到 BaostockClient.DownloadPdfAsync(adjunctUrl, rangeStart, ct)。
带 Range 时返回 206 Partial Content + Accept-Ranges: bytes。浏览器、curl -C -、HttpClient 续传场景全部生效。
Bug-N-05:/api/meta/endpoints 增加 method 字段
EndpointDescriptor record 新增 Method 字段(默认 "POST"),前端可据此正确选择请求方法。
CI 自动化
本版本是首个由 GitHub Actions release.yml 自动 publish NuGet 的版本(v1.3.1-ci-smoke 验证后)。后续 v1.3.x+ 推 tag 即可自动发布。
测试与质量
- 305 passed / 0 failed / 1 skipped(Category!=Live,基线保持)
- 0 warning / 0 error
Breaking Changes
无。所有新字段均为可选 + 默认值,旧调用方零改动可消费新 envelope。
升级
<PackageReference Include="Baostock.NET" Version="1.3.2" />v1.3.1 — 银行利润表字段兜底 + 手册补齐
v1.3.1 — 银行利润表字段兜底 + 手册补齐
发布日期:2026-04-24
修复
Finding B-ICBC:银行/券商利润表 TotalOperateIncome 字段兜底
上游数据源(东财 / 新浪)对银行/券商公司的利润表原生不包含"营业总收入"字段:
- EastMoney 实测:工行 SH601398 companyType=3 响应 无
TOTAL_OPERATE_INCOME,有OPERATE_INCOME=8382亿 - Sina 实测:同股响应 无
BIZTOTINCO,有BIZINCO=8382亿
在银行/券商业务中,营业总收入 == 营业收入(两者语义等价)。v1.3.1 起两源 ParseResponse 在 TotalOperateIncome == null && OperateIncome != null 时自动从 OperateIncome 复制。
- 银行/券商股
totalOperateIncome现在非空(工行 ≈ 8382 亿) - 非银股不受影响(原本就有独立
TotalOperateIncome) FullIncomeStatementRow本体字段不变
文档
Finding D-Manual:手册模块 I 补 I6/I7/I8 交易所硬性用例
README.UserAgentTest.md 模块 I 新增:
- I6:创业板
SZ300750AnnualReport(防 Bug-N-03 回归) - I7:科创板
SH688981AnnualReport - I8:北交所
BJ430047All
三条均为 Blocker 级用例——失败不允许解释为"该公司没发公告"。
测试与质量
- 305 passed / 0 failed / 1 skipped(Category!=Live,较 v1.3.0 +2 新测试)
- 0 warning / 0 error
- 新测试:
Parse_BankTemplate_CopiesOperateIncomeToTotalOperate(Sina + EastMoney 各一)
Breaking Changes
无。完全兼容 v1.3.0 API。
升级
<PackageReference Include="Baostock.NET" Version="1.3.1" />完整变更:CHANGELOG.md
v1.3.0 — HTTP 多源扩展(财报三表 + 巨潮公告)
v1.3.0 — HTTP 多源扩展
发布日期:2026-04-24
NuGet:https://www.nuget.org/packages/Baostock.NET/ (稍后发布)
核心新增
财报三表(资产负债 / 利润 / 现金流)
东财主源(P=0)+ 新浪备用源(P=1)Hedged 对冲(500ms):
BaostockClient.QueryFullBalanceSheetAsync(request, ct)BaostockClient.QueryFullIncomeStatementAsync(request, ct)BaostockClient.QueryFullCashFlowAsync(request, ct)
FullBalanceSheetRow(24 字段)/ FullIncomeStatementRow(15 字段)/ FullCashFlowRow(12 字段),含 RawFields 兜底。
巨潮公告 + PDF 下载
BaostockClient.QueryAnnouncementsAsync(request, ct)— 分类筛选(年报 / 半年报 / 季报 / 业绩预告 / 临时)BaostockClient.DownloadPdfAsync(adjunctUrl, rangeStart?, ct)— 返回Stream,206 Partial Content 断点续传BaostockClient.DownloadPdfToFileAsync(adjunctUrl, dest, resume?, ct)— 直接落盘,支持 resume
新增 CninfoOrgIdResolver 在线解析真实 orgId + 进程级缓存,解决创业板 / 科创板 / 深主板公告静默返回 0 行的 bug。
TestUI 新端点
POST /api/financial/balance-sheetPOST /api/financial/income-statementPOST /api/financial/cashflowPOST /api/cninfo/announcementsGET /api/cninfo/pdf-download(流式 PDF,支持浏览器<a href>直接触发)
前端 financial / cninfo 两个新 sidebar 分组,公告查询结果自动渲染 PDF 下载链接。
文档
- docs/v1.3.0/README.md — 总览
- docs/v1.3.0/financial-statements.md — 财报三表详解
- docs/v1.3.0/cninfo-pdf.md — 巨潮公告 + PDF
- docs/v1.3.0/testui.md — TestUI 新端点使用
- docs/v1.3.0/migration-from-1.2.md — 从 v1.2.0 升级
质量
- 303 passed / 0 failed / 1 skipped(Category!=Live,较 v1.2.0 +62 个新测试)
- 0 warning / 0 error
- UR 第 3 轮终验 PASS(5 交易所覆盖:沪主板 / 深主板 / 创业板 / 科创板 / 北交所)
已知限制
- 银行类股票(如 SH601398 工行)利润表
totalOperateIncome字段为空——上游 Sina 银行模板原生不含BIZTOTINCO,operateIncome(对应BIZINCO)仍填充。v1.3.1 将加自动复制。 README.UserAgentTest.md模块 I 暂未强制覆盖创业板 / 科创板 / 北交所硬性用例,v1.3.1 补齐。- 巨潮
/api/cninfo/pdf-download端点当前不透传 Range 头(集成端点级,非CninfoSource本身),v1.3.1 评估是否支持。
Breaking Changes
无。v1.2.0 现有 API 全兼容。
升级
<PackageReference Include="Baostock.NET" Version="1.3.0" />完整变更:见 CHANGELOG.md
v1.2.0 — A 股综合数据 SDK
🎉 Baostock.NET v1.2.0 正式版
从单源 baostock TCP 协议封装升级为 A 股综合数据 SDK,引入 Hedged Requests + 健康感知多源架构。
亮点
- 三源实时行情 — Sina (P=0) / Tencent (P=1) / EastMoney (P=2) 并发对冲,500ms hedge 间隔,首个成功胜出
- 双源历史 K 线 — EastMoney 主源(11 字段全)+ Tencent 备用源(6 字段)
- TCP 自愈 — 半死检测(socket.Poll + IsConnected 属性)+ 自动 reconnect + relogin(CAS 线程安全,最多 1 次重试)
- SourceHealthRegistry — 连续 3 次失败自动进入 30s 冷却
- TestUI 子项目 — 37 endpoint + 压测面板(内置硬锁保护 baostock TCP 单连接)
- CodeFormatter — 东财风格
SH600519为标准,向后兼容 6 种输入格式
⚠️ BREAKING CHANGES
详细迁移指南见 docs/v1.2.0/migration-from-1.0.md。
- 证券代码格式统一为东财风格:所有 27 个 baostock TCP 查询 API 入参默认
SH600519(旧sh.600519仍向后兼容) - 异常类型契约:无效 code 现在抛
ArgumentException(InnerException=FormatException保留细节) - Models 输出格式:
row.Code等统一返回东财风格 IsLoggedIn语义(half-BREAKING):现在= Session.IsLoggedIn && Transport.IsConnected;新增IsConnected属性单独暴露 socket 健康
测试与质量
- 272 passed / 0 failed / 2 skipped
- 0 warning / 0 error(Release,
TreatWarningsAsErrors=true) - Sprint 0~3 P0 全部交付
- UR(真实交易员)三轮验收通过
已知限制(v1.3.0 跟进)
- 北交所(BJ)历史 K 线:EM
116.端点 ResponseEnded + Tencent 空数组 →AllSourcesFailedException - BJ 实时盘前 09:00 前数据陈旧(Sina 全零、Tencent 缓存昨收)
_credentials内存明文缓存(v1.3.0 计划升级SecureString)
文档
安装
dotnet add package Baostock.NET --version 1.2.0