如何在.NET Core WebAPI中集成并托管Swagger Codegen
嘿,我刚好折腾过类似的需求,咱们一步步来搞定在.NET Core WebAPI里托管Swagger Codegen的事儿,不用纠结文档不足的问题,我把实操步骤给你理得明明白白:
一、先明确:是否需要额外工具?
不需要单独下载独立的Swagger Codegen CLI(当然本地测试可以用,但托管到WebAPI里用NuGet包更省心)。核心是通过.NET生态的包来封装Swagger Codegen的能力,或者用更贴合.NET的替代方案NSwag(后面会讲)。
二、方案1:用SwaggerCodegenNet直接托管Swagger Codegen
这是社区封装的.NET版Swagger Codegen,不用依赖Java环境,直接集成到WebAPI里。
步骤1:安装必要NuGet包
打开.NET CLI或者Package Manager Console,执行:
dotnet add package SwaggerCodegenNet # 如果你还没装Swashbuckle,补上这个 dotnet add package Swashbuckle.AspNetCore.Swagger
步骤2:创建Codegen接口控制器
新建一个CodegenController,写一个POST接口接收Swagger JSON/RAML,生成.NET Core客户端代码并返回ZIP包:
using Microsoft.AspNetCore.Mvc; using SwaggerCodegenNet; using System.IO.Compression; [ApiController] [Route("api/[controller]")] public class CodegenController : ControllerBase { // 接收Swagger JSON生成客户端 [HttpPost("generate-dotnet-client")] public IActionResult GenerateDotnetClient([FromBody] string swaggerJson) { try { // 配置生成选项 var codegenOptions = new CodegenOptions { GeneratorName = "csharp-netcore", // 指定.NET Core客户端生成器 OutputFolder = Path.Combine(Path.GetTempPath(), "SwaggerCodegenTemp"), AdditionalProperties = new Dictionary<string, string> { {"packageName", "MyCustomApiClient"}, {"packageVersion", "1.0.0"}, {"targetFramework", "net6.0"} // 按你的项目框架调整 } }; // 执行代码生成 var codegen = new SwaggerCodegen(); codegen.GenerateFromJsonString(swaggerJson, codegenOptions); // 打包成ZIP返回 var zipPath = Path.Combine(Path.GetTempPath(), "MyApiClient.zip"); ZipFile.CreateFromDirectory(codegenOptions.OutputFolder, zipPath); var zipBytes = System.IO.File.ReadAllBytes(zipPath); return File(zipBytes, "application/zip", "MyApiClient.zip"); } catch (Exception ex) { return BadRequest($"生成失败:{ex.Message}"); } finally { // 清理临时文件 var tempFolder = Path.Combine(Path.GetTempPath(), "SwaggerCodegenTemp"); if (Directory.Exists(tempFolder)) Directory.Delete(tempFolder, true); var zipPath = Path.Combine(Path.GetTempPath(), "MyApiClient.zip"); if (System.IO.File.Exists(zipPath)) System.IO.File.Delete(zipPath); } } // 支持RAML格式:先转成Swagger JSON再生成 [HttpPost("generate-dotnet-client-from-raml")] public IActionResult GenerateFromRaml([FromBody] string ramlContent) { try { // 用Raml.Net把RAML转成Swagger JSON var ramlParser = new Raml.Net.RamlParser(); var ramlApi = ramlParser.Parse(ramlContent); var swaggerJson = ramlApi.ToSwaggerJson(); // 复用上面的生成逻辑 return GenerateDotnetClient(swaggerJson); } catch (Exception ex) { return BadRequest($"RAML转换或生成失败:{ex.Message}"); } } }
注意:要支持RAML的话,还得额外装Raml.Net包:
dotnet add package Raml.Net
三、方案2:用NSwag(更贴合.NET生态的替代方案)
如果担心SwaggerCodegenNet的维护性,NSwag是.NET原生的工具链,对.NET特性(比如Nullable、Async/Await)支持更好,完全不需要依赖Java。
步骤1:安装NSwag包
dotnet add package NSwag.AspNetCore
步骤2:创建NSwag Codegen接口
using Microsoft.AspNetCore.Mvc; using NJsonSchema.CodeGeneration.CSharp; using NSwag; [ApiController] [Route("api/[controller]")] public class NSwagCodegenController : ControllerBase { [HttpPost("generate-dotnet-client")] public async Task<IActionResult> GenerateDotnetClient([FromBody] string swaggerJson) { try { // 加载Swagger文档 var swaggerDoc = await OpenApiDocument.FromJsonAsync(swaggerJson); // 配置C#客户端生成选项 var generatorSettings = new CSharpClientGeneratorSettings { ClassName = "MyNSwagApiClient", Namespace = "MyApi.Client.NSwag", TargetFramework = CSharpTargetFramework.Net60, GenerateClientInterfaces = true, GenerateExceptionClasses = true, GenerateNullableReferenceTypes = true // 支持.NET 6+的可空引用类型 }; // 生成代码 var generator = new CSharpClientGenerator(swaggerDoc, generatorSettings); var clientCode = generator.GenerateFile(); // 返回代码文件(也可以打包成ZIP) var codeBytes = System.Text.Encoding.UTF8.GetBytes(clientCode); return File(codeBytes, "text/plain", "MyNSwagApiClient.cs"); } catch (Exception ex) { return BadRequest($"生成失败:{ex.Message}"); } } }
四、测试你的Codegen接口
启动WebAPI后,用Postman或者Swagger UI调用对应的接口:
- 调用
/api/codegen/generate-dotnet-client,传入你的Swagger JSON(可以从/swagger/v1/swagger.json获取),就能拿到生成的客户端代码ZIP包 - 如果是RAML,调用
/api/codegen/generate-dotnet-client-from-raml传入RAML内容即可
内容的提问来源于stack exchange,提问作者arpymastro
相关产品推荐
相关产品推荐

