Skip to content

Releases: simplerjiang/baostock.NET

v1.3.4 — RFC 7233 完全合规 + Actions 升级

25 Apr 06:20

Choose a tag to compare

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 新增私有 SkipExactAsyncResponseOwnedStream 不支持 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 契约缺陷热修

25 Apr 05:01

Choose a tag to compare

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-quoterealtime-quoteshistory-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-Range total 准确
  • 新增 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 支持

25 Apr 04:15

Choose a tag to compare

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 — 银行利润表字段兜底 + 手册补齐

24 Apr 14:20

Choose a tag to compare

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 起两源 ParseResponseTotalOperateIncome == null && OperateIncome != null 时自动从 OperateIncome 复制。

  • 银行/券商股 totalOperateIncome 现在非空(工行 ≈ 8382 亿)
  • 非银股不受影响(原本就有独立 TotalOperateIncome
  • FullIncomeStatementRow 本体字段不变

文档

Finding D-Manual:手册模块 I 补 I6/I7/I8 交易所硬性用例

README.UserAgentTest.md 模块 I 新增:

  • I6:创业板 SZ300750 AnnualReport(防 Bug-N-03 回归)
  • I7:科创板 SH688981 AnnualReport
  • I8:北交所 BJ430047 All

三条均为 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 多源扩展(财报三表 + 巨潮公告)

24 Apr 14:03

Choose a tag to compare

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-sheet
  • POST /api/financial/income-statement
  • POST /api/financial/cashflow
  • POST /api/cninfo/announcements
  • GET /api/cninfo/pdf-download(流式 PDF,支持浏览器 <a href> 直接触发)

前端 financial / cninfo 两个新 sidebar 分组,公告查询结果自动渲染 PDF 下载链接。

文档

质量

  • 303 passed / 0 failed / 1 skipped(Category!=Live,较 v1.2.0 +62 个新测试)
  • 0 warning / 0 error
  • UR 第 3 轮终验 PASS(5 交易所覆盖:沪主板 / 深主板 / 创业板 / 科创板 / 北交所)

已知限制

  • 银行类股票(如 SH601398 工行)利润表 totalOperateIncome 字段为空——上游 Sina 银行模板原生不含 BIZTOTINCOoperateIncome(对应 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

24 Apr 07:51

Choose a tag to compare

🎉 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

  1. 证券代码格式统一为东财风格:所有 27 个 baostock TCP 查询 API 入参默认 SH600519(旧 sh.600519 仍向后兼容)
  2. 异常类型契约:无效 code 现在抛 ArgumentExceptionInnerException=FormatException 保留细节)
  3. Models 输出格式row.Code 等统一返回东财风格
  4. 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