0

0

C# 操作OpenAPI/Swagger文件 C#如何读取API定义文件来生成客户端代码

畫卷琴夢

畫卷琴夢

发布时间:2026-03-02 10:20:44

|

421人浏览过

|

来源于php中文网

原创

最稳方案是用 nswag 从 openapi 文件生成 c# 客户端:支持文件/url/字符串输入,兼容 .net standard 2.0+ 和现代 httpclient;推荐 nswag.msbuild 自动集成,注意版本锁定、配置 codegenerator="csharp"、手动 include 生成文件,并复用 ihttpclientfactory 管理 httpclient。

c# 操作openapi/swagger文件 c#如何读取api定义文件来生成客户端代码

NSwag 读取 OpenAPI 文件生成 C# 客户端最稳

直接说结论:别手写解析器,也别碰 Swashbuckle.AspNetCore 的运行时生成逻辑——它不面向客户端代码生成。真正能稳定把 openapi.jsonswagger.yaml 转成可编译 C# 客户端的,是 NSwag。它原生支持从文件路径、URL 甚至内嵌 JSON 字符串加载定义,且生成结果默认兼容 .NET Standard 2.0+ 和现代 HttpClient 用法。

常见错误是试图用 Newtonsoft.Json 直接反序列化 OpenAPI 文档到自定义 POCO,结果卡在 components/schemas 的递归引用、oneOf/anyOf 的多态建模,或者 example 字段类型不一致上——OpenAPI 是描述性规范,不是纯数据结构,硬解析必崩。

  • NSwagStudio 图形界面适合试跑和调参,但 CI/CD 中必须用 NSwag.exe 命令行或 NSwag.MSBuild MSBuild 任务
  • 若 OpenAPI 文件含本地 $ref(比如 ./schemas/user.json),确保工作目录正确,或改用 --input 绝对路径 + --resolve-external-references
  • 生成的客户端默认带 HttpClient 生命周期管理,但不会自动加 BaseAddress——得自己 new 时传入,或改 BaseUrl 属性

NSwag.MSBuild 在 .csproj 里自动生成客户端

这是最省心的集成方式:每次 build 时自动拉取最新 OpenAPI 文件并更新客户端代码,避免手动覆盖出错。

关键点不在“能不能”,而在“怎么让它只在需要时触发”:

  • NSwag.MSBuild 包版本锁死(如 13.18.2),不同大版本对 OpenAPI 3.1 支持差异很大,14.x 开始要求 .NET 6+ 运行时
  • <openapireference></openapireference> 必须指定 CodeGenerator="CSharp",否则默认生成 TypeScript
  • 如果 OpenAPI 文件在远程(如 https://api.example.com/swagger/v1/swagger.json),加 SourceUrl 属性;若在项目内,用 Include 指向 openapi.json 并设 CopyToOutputDirectory="PreserveNewest"
  • 生成的 .cs 文件默认标记为 <compile remove="..."></compile>,得额外加 <compile include="GeneratedApiClient.cs"></compile> 否则编译报错

生成的客户端里 HttpClient 怎么配才不出问题

NSwag 生成的类里有 HttpClient 参数构造函数,但新手常忽略三件事:超时、认证头、重试策略。

Pixlr
Pixlr

Pixlr是一款2008年推出的在线图片编辑和AI图片处理工具,目前已推出AI 图像生成器、AI 生成填充、AI 删除背景、AI 删除对象和 AI 图像扩展等现代 AI 工具。

下载

它不帮你管连接池复用,也不自动塞 Authorization ——这些都得你来兜底:

  • 别用 new HttpClient() 直接传进去,必须复用 IHttpClientFactory 创建的实例,否则 DNS 缓存、连接泄漏风险极高
  • 若 API 要 Bearer Token,别在每个方法里手动加 client.DefaultRequestHeaders.Authorization,改用生成类的 ApiKeyToken 构造参数,或继承后重写 PrepareRequest 方法
  • 生成的 System.Net.Http.HttpClient 不含 Polly 重试逻辑,如需自动重试 429/503,得在外层包装,不能指望 NSwag 输出里自带
  • 如果 OpenAPI 定义里写了 x-ms-client-principal-id 这类扩展字段,NSwag 默认忽略——得开 AllowReferencesInExamples 或自定义 SwaggerExtension 处理器

遇到 OneOfnullable 字段生成失败怎么办

这是 OpenAPI 3.0+ 最常踩的坑:NSwag 默认把 oneOf 当成联合类型(union),但 C# 没原生 union,它会退化成 object 或生成一堆抽象基类 + 具体实现类,导致反序列化失败。

根本原因不是工具不行,而是你没告诉它“你想怎么映射”:

  • NSwagStudio 或 MSBuild 配置里开 GenerateOptionalPropertiesAsNullable,否则 "nullable": true 的字段仍生成为非空引用类型,JSON.NET 反序列化时崩
  • oneOf,优先用 UseOneOfForPolymorphism + DiscriminatorName(如果 OpenAPI 里定义了 discriminator.propertyName),否则强制设 UseClassInheritance 并指定基类名
  • 如果字段值可能是 null 或字符串,但 OpenAPI 描述模糊(比如没写 type: ["string", "null"]),得手动在 YAML 里补 x-nullable: true,再让 NSwag 识别
  • 生成后检查 JsonConverter 注解是否出现在字段上——没有的话,DateTimeOffset? 可能被当成 DateTimeOffset,反序列化 null 时报 JsonReaderException

OpenAPI 是契约,不是文档。生成客户端时任何字段语义偏差,都会在运行时某个深夜变成 NullReferenceException 或静默丢数据——宁可花十分钟校验生成结果,别信“跑通就行”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

43

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

94

2026.02.25

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

450

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

326

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

249

2023.09.22

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

43

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.5万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号